如何在序列化QuerySet中包含带注释的结果?
data = serializer.serialize(Books.objects.filter(publisher__id=id).annotate(num_books=Count('related_books')), use_natural_keys=True)
然而,键/值pare {'num_books':number}未包含在json结果中。
我一直在互联网上搜索类似的问题,但我没有找到适合我的解决方案。
谢谢!
答案 0 :(得分:5)
我做了一些研究,发现serializer.serialize
只能序列化查询集,而注释只是为查询集的每个对象添加一个属性,因此当您尝试序列化查询时,注释字段不会显示。这是我的实施方式:
from django.core.serializers.json import DjangoJSONEncoder
books = Books.objects.filter(publisher__id=id).annotate(num_books=Count('related_books')).values()
json_data = json.dumps(list(books), cls=DjangoJSONEncoder)
答案 1 :(得分:1)
如this post所示,您可以在序列化程序中使用SerializerMethodField:
class BooksSerializer(serializers.ModelSerializer):
num_books = serializers.SerializerMethodField()
def get_num_books(self, obj):
try:
return obj.num_books
except:
return None
它将序列化带注释的值(只读)
答案 2 :(得分:0)
要从特定列中获取计数,您必须通过values
方法
>>>> Books.objects.filter(publisher__id=id).values('<group by field>').annotate(num_books=Count('related_books'))
[{'num_books': 1, '<group by field>': X}]
答案 3 :(得分:0)
根据链接,this已在几个月前通过拉取请求(https://github.com/django/django/pull/1176)解决。
您需要添加num_books
作为属性:
class Publisher():
....
@property
def num_books(self):
return some_way_to_count('related_books')
然后像这样调用它:
data = serializer.serialize(Books.objects.filter(publisher__id=id)), use_natural_keys=True, extra=['num_books'])
我对确切的语法不太确定,因为我不太了解序列化程序。