我正在为QuerySet中的每个项目生成聚合:
def get_queryset(self): from django.db.models import Count queryset = Book.objects.annotate(Count('authors')) return queryset
但是我没有得到JSON响应中的计数。
从get_queryset返回的queryset提供了将要通过序列化程序的内容的列表,该序列化程序控制对象的表示方式。尝试在Book序列化器中添加其他字段,例如:
author_count = serializers.IntegerField( source='author_set.count', read_only=True )
编辑:正如其他人所说,这不是返回许多结果的情况下增加计数的最有效方法,因为它将对每个实例命中数据库。有关更有效的解决方案.
接受的解决方案将在数据库返回结果时访问数据库。对于每个结果,将count查询数据库。
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项的作者计数。