13👍
I did some research and found that serializer.serialize
can only serialize queryset, and annotation just adds an attribute with each object of the queryset, so when you try to serialize a query, annotated fields aren’t shown. This is my way of implementation:
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)
10👍
As shown in this post you can use SerializerMethodField in your Serializer:
class BooksSerializer(serializers.ModelSerializer):
num_books = serializers.SerializerMethodField()
def get_num_books(self, obj):
try:
return obj.num_books
except:
return None
It will serialize the annotated value (readonly)
1👍
Based on the link, this has been solved by pull request (https://github.com/django/django/pull/1176) some months ago.
You need to add num_books
as a property:
class Publisher():
....
@property
def num_books(self):
return some_way_to_count('related_books')
and then call it like so:
data = serializer.serialize(Books.objects.filter(publisher__id=id)), use_natural_keys=True, extra=['num_books'])
I’m not too sure about the exact syntax, since I don’t work much with serializers.
-1👍
To get count from specific columns, you must declare them via values
method
>>>> Books.objects.filter(publisher__id=id).values('<group by field>').annotate(num_books=Count('related_books'))
[{'num_books': 1, '<group by field>': X}]
- Django generate csv file on view and download
- How to have Accent-insensitive filter in django with postgres?
- How to configure Apache to run ASGI in Django Channels? Is Apache even required?
- Pytest and Django settings runtime changes
Source:stackexchange.com