我有两个模型:图书馆和一本书。图书馆将有很多书。
class Library(models.Model):
library_id = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
city = models.CharField(max_length=30)
address = models.CharField(max_length=80)
phone = models.CharField(max_length=30, blank=True, null=True)
website = models.CharField(max_length=60, blank=True, null=True)
class Book(models.Model):
book_id = models.AutoField(primary_key=True)
title = models.CharField(max_length=30)
# A library has many books
which_library = models.ForeignKey('Library', related_name='books', on_delete=models.CASCADE)
reader = models.ManyToManyField('Reader', related_name='wishlist')
我的序列化器:
class LibrarySerializer(serializers.ModelSerializer):
class Meta:
model = Library
fields = '__all__'
class BookSerializer(serializers.ModelSerializer):
wishlist = ReaderSerializer(many=True, read_only=True)
class Meta:
model = Book
fields = '__all__'
我的看法是:
class LibraryViewSet(viewsets.ModelViewSet):
queryset = Library.objects.all()
serializer_class = LibrarySerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.filter(which_library=library_id)
serializer_class = BookSerializer
我的网址:
router = routers.DefaultRouter()
router.register(r'libraries', LibraryViewSet)
router.register(r'books/(?P<library_id>[0-9]+)', BookViewSet)
urlpatterns = router.urls
我的图书馆路线正常。但是对于“书籍”,我只需要归还属于特定图书馆的书籍。默认URL和all()返回数据库中的所有书籍,并且可以通过点击
books/1
来检索单个书籍。我怎样才能做到这一点?我以前可以做到:
@api_view(['GET', 'POST'])
def books(request, library_id):
但是现在我想用ModelViewSet来做。
最佳答案
覆盖您的viewset的get_queryset
方法,您可以在其中定义以返回特定的书。这是这样的。
class BookViewSet(viewsets.ModelViewSet):
serializer_class = LibrarySerializer
def get_queryset(self):
user = self.request.user
books = Book.objects.filter(which_library=self.kwargs['library_id'])
return books
您还可以定义
list
和detail
方法,您可以在其中定义对Books的自定义查询。显示为here。基本名称应这样设置。
router.register(r'books/(?P<library_id>[0-9]+)', BookViewSet, base_name='books')
关于django - Django rest ModelViewSet过滤对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48093906/