一尘不染

如何在Django-rest-framework queryset响应中添加注释数据?

django

我正在为QuerySet中的每个项目生成聚合:

def get_queryset(self):
    from django.db.models import Count
    queryset = Book.objects.annotate(Count('authors'))
    return queryset

但是我没有得到JSON响应中的计数。


阅读 960

收藏
2020-04-02

共2个答案

一尘不染

从get_queryset返回的queryset提供了将要通过序列化程序的内容的列表,该序列化程序控制对象的表示方式。尝试在Book序列化器中添加其他字段,例如:

author_count = serializers.IntegerField(
    source='author_set.count', 
    read_only=True
)

编辑:正如其他人所说,这不是返回许多结果的情况下增加计数的最有效方法,因为它将对每个实例命中数据库。有关更有效的解决方案.

2020-04-02
一尘不染

接受的解决方案将在数据库返回结果时访问数据库。对于每个结果,将count查询数据库。

问题是要向序列化器添加注释,这比count对响应中的每个项目进行查询要有效得多。

一个解决方案:

models.py

class Author(models.Model):
    name = models.CharField(...)
    other_stuff = models...
    ...

class Book(models.Model):
    author = models.ForeignKey(Author)
    title = models.CharField(...)
    publication_year = models...
    ...

serializers.py

class BookSerializer(serializers.ModelSerializer):
    authors = serializers.IntegerField()

    class Meta:
        model = Book
        fields = ('id', 'title', 'authors')

views.py

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.annotate(authors=Count('author'))
    serializer_class = BookSerializer
    ...

这样就可以在数据库级别进行计数,避免点击数据库以检索每个返回Book项的作者计数。

2020-04-02