Автоматическая установка 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>.

Посмотрите документацию для получения дополнительной информации.

Вернуться на верх