Django REST Framework Serializer 在 init 中初始化变量

Django REST Framework Serializer Initialize variable in init

我正在尝试在序列化程序 class 中初始化 Django 模型的对象。假设我有 2 个型号 ABCD 和 WXYZ。我对 ABCD 执行了筛选并将结果发送到序列化程序。序列化器需要使用 ABCD 模型的字段获取 WXYZ 模型的实例,并获取一些结果。我想在 init 方法中获取 WXYZ 实例,以便我可以在序列化程序 class 的所有函数中访问它。 型号:

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 次额外查询;如果这是一个问题,您可以通过为每个 ABCD 预取 WXYZes 来优化它,这样序列化程序就不需要了,但这更复杂,而且确实一个单独的问题。)