Django REST Framework Serializer Инициализация переменной в init

Я пытаюсь инициализировать объект модели django внутри класса Serializer. Допустим, у меня есть 2 модели ABCD и WXYZ. Я выполнил фильтр на ABCD и отправил результаты в сериализатор. Сериализатор должен получить экземпляр модели WXYZ, используя поле модели ABCD, и получить некоторый результат. Я хочу получить экземпляр WXYZ в методе init, чтобы иметь доступ к нему во всех функциях класса сериализатора. Модели:

class ABCD():
    col1 = models.Integerfield(...)
    ...

class WXYZ():
    col2 = models.Integerfield(...)
    title = models.Charfield(...)
    ...

views.py:

# performed a filter on ABCD model
abcd_objects = ABCD.objects.filter(...)
results = ABCDserializer(abcd_objects, many=True).data

serialzers.py

class ABCDserializer(serializers.ModelSerializer):
    title = serializers.SerializerMethodField('fetch_title')
    ...

    def __init__(self, obj):
        ans = WXYX.objects.get(col2=obj.col1)
        self.wxyz_obj = ans

    def fetch_title(self, obj):
        return self.wxyz_obj.title

    class Meta:
        model = ABCD
        fields = ['title', ...]

Не переопределяйте __init__ сериализатора; ищите соответствующий wxyz, например, в свойстве, используя self.instance.

class ABCDserializer(serializers.ModelSerializer):
    title = serializers.SerializerMethodField("fetch_title")

    # TODO: Use `functools.cached_property` if on Python 3.8+
    @property
    def _related_wxyz(self):
        return WXYZ.objects.get(col2=self.instance.col1)

    def fetch_title(self, obj):
        return self._related_wxyz.title

    class Meta:
        model = ABCD
        fields = ["title", ...]

(Конечно, это потребует N дополнительных запросов; если это проблема, вы можете оптимизировать это путем предварительной выборки WXYZ для каждого ABCD, чтобы сериализатор не нуждался в этом, но это более сложный и действительно отдельный вопрос)

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