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 来优化它,这样序列化程序就不需要了,但这更复杂,而且确实一个单独的问题。)
我正在尝试在序列化程序 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 来优化它,这样序列化程序就不需要了,但这更复杂,而且确实一个单独的问题。)