django - Django rest ModelViewSet过滤对象

标签 django django-rest-framework

我有两个模型:图书馆和一本书。图书馆将有很多书。

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

您还可以定义listdetail方法,您可以在其中定义对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/

相关文章:

python - Django : open modal instead of redirecting to another page 中的 login_required 装饰器

python - Django:更新或更改以前保存的模型数据

python - Django:空表单错误

python - 不支持的媒体类型 Django API

python - Django cache_page - 预填充/预缓存

django - 在哪里放置 django 信号接收器代码,将它们分布在多个文件中?

python - Django:如何在根据发布请求将数据保存到数据库之前检查数据是否正确?

python - 更改或删除 PaginationSerializer 中的默认返回值

django - 在 Django Rest Framework 中创建或更新(使用 PUT)

Python Django : Enabling tags in models. 文本字段()