【问题标题】:Django Rest Framework - problem with filtering dataDjango Rest Framework - 过滤数据的问题
【发布时间】:2021-06-17 13:19:24
【问题描述】:

在我的模型中,我有 Book 和 Author 与 M2M 关系。

models.py

from django.db import models


from django.db import models


class Book(models.Model):
    title          = models.CharField(max_length=200)
    published_date = models.DateField(auto_now_add=False)
    categories     = models.CharField(max_length=300, null=True, blank=True)
    average_rating = models.FloatField(null=True, blank=True)
    ratings_count  = models.IntegerField(null=True, blank=True)
    thumbnail      = models.URLField(null=True, blank=True)

def authors(self):
    return self.author_set.all()

def __str__(self):
    return f'title: {self.title} \n' \
           f'date of publication: {self.published_date}'


class Author(models.Model):
    name  = models.CharField(max_length=200)
    books = models.ManyToManyField(Book)

    def __str__(self):
        return str(self.name)

在我的序列化程序中,我从 models.py 中的 def authors 获取作者

serializers.py
    class Meta:
        model = Author
        fields = ['name']


class BookSerializer(serializers.ModelSerializer):
    authors = AuthorSerializer(many=True)

    class Meta:
        model = Book
        fields = [
            'authors',
            'title',
            'published_date',
            'categories',
            'average_rating',
            'ratings_count',
            'thumbnail'
        ]

所以在views.py中我想按作者过滤书籍

views.py
class BooksListAPIView(generics.ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = (filters.OrderingFilter, DjangoFilterBackend)
    filter_fields = ['published_date', 'authors']
    ordering_fields = ['published_date']

但它给了我这个错误

'Meta.fields' must not contain non-model field names: authors 

知道如何过滤作者的数据,以便提取给定作者的书籍。 我想选择过滤器。 提前致谢。

【问题讨论】:

    标签: django django-rest-framework django-filter


    【解决方案1】:

    您从fields 中删除authors,并让它由序列化程序中的AuthorSerializer 处理:

    class BookSerializer(serializers.ModelSerializer):
        authors = AuthorSerializer(source='author_set', many=True)
    
        class Meta:
            model = Book
            fields = [  # ← no authors
                'author_set',
                'title',
                'published_date',
                'categories',
                'average_rating',
                'ratings_count',
                'thumbnail'
            ]

    请注意,您可以使用 related_name=… 参数反向重命名关系:

    class Author(models.Model):
        name  = models.CharField(max_length=200)
        books = models.ManyToManyField(Book, related_name='authors')
    
        def __str__(self):
            return self.name

    在这种情况下,来源只是authors

    class BookSerializer(serializers.ModelSerializer):
        #                   no source ↓
        authors = AuthorSerializer(many=True)
    
        class Meta:
            model = Book
            fields = [
                'authors',
                'title',
                'published_date',
                'categories',
                'average_rating',
                'ratings_count',
                'thumbnail'
            ]

    【讨论】:

    • 它给了我这个错误:在序列化程序 BookSerializer 上声明了字段“作者”,但未包含在“字段”选项中。
    • @dawid: 但你是否将source 设置为author_set
    • 是的,我做到了,我从模型中删除了 def 作者,并从 Bookserializer 中的字段中删除了作者
    • 我应该把这个 def authors 方法留在 models.py 中吗?
    • @dawid:您是否将related_name 设置为authors
    猜你喜欢
    • 2017-12-28
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多