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, чтобы сериализатор не нуждался в этом, но это более сложный и действительно отдельный вопрос)