Автоматическая установка id внутри фильтра на сериализаторе
Я пытаюсь получить общий подсчет из определенной модели внутри сериализации.
"results": [
{
"event_id": 24,
"unique_visitors": 1,
"returned_visitors": 2
},
]
Два значения, которые я извлекаю в unique_visitors и returned_visitors, приходят из одного другого модуля.
Что я сделал в serializer.py:
unique_visitors = EventCounter.objects.filter(is_unique=True).filter(event_id=24).count()
returned_visitors = EventCounter.objects.filter(is_unique=False).filter(event_id=24).count()
def get_unique_visitors(self, obj):
return self.unique_visitors
def get_returned_visitors(self, obj):
return self.returned_visitors
Я пытаюсь сделать так, чтобы внутри filter(event_id=24) автоматически находился id текущего объекта.
Помогите мне, пожалуйста?
Поэтому для достижения желаемого результата необходимо использовать SerializerMethodField().
Это поле только для чтения. Оно получает свое значение путем вызова метода класса сериализатора, к которому оно присоединено.
Например
from rest_framework import serializers
...
unique_visitors = serializers.SerializerMethodField()
returned_visitors = serializers.SerializerMethodField()
...
def get_unique_visitors(self, obj):
unique_visitors = EventCounter.objects.filter(is_unique=True)\
.filter(event_id=24).count()
return unique_visitors
def get_returned_visitors(self, obj):
returned_visitors = EventCounter.objects.filter(is_unique=False)\
.filter(event_id=24).count()
return returned_visitors
SerializerMethodField также принимает один необязательный параметр method_name, который можно добавить, чтобы изменить имя метода, к которому прикреплено поле.
Если параметр не включен, то по умолчанию он принимает значение get_<field_name>.
Посмотрите документацию для получения дополнительной информации.