我正在使用包含许多领域的模型。有一个字段是属性,它返回模型的实例。类似于以下内容:
class A(Model):
@property
def last_obj(self):
# Returns an object
我遇到的问题是此属性可以返回2种不同的Model类型。它可以返回类型一的对象,也可以返回类型二的对象。这在序列化器中造成了麻烦。我有一个由嵌套序列化程序组成的序列化程序。这两个对象足够相似,因此可以在一个序列化器之上使用另一个序列化器,但是它们唯一的字段不会被序列化。
class A_Serializer(Serializer):
class SerializerOne(CustomSerializer):
#Serializes certain fields in custom manner
class Meta:
model = models.one
exclude = ('id')
base_name = 'one'
class SerializerTwo(CustomSerializer):
#Serializes certain fields in custom manner
class Meta:
model = models.two
exclude = ('id')
base_name = 'two'
last_obj = SerializerOne() #This works, but not viable because of what I stated above
因此,为了能够动态调用正确的序列化程序,我的解决方案是在序列化程序方法字段中有条件地序列化属性:
class A_Serializer(Serializer):
class SerializerOne(CustomSerializer):
#Serializes certain fields in custom manner
class Meta:
model = models.one
exclude = ('id')
base_name = 'one'
class SerializerTwo(CustomSerializer):
#Serializes certain fields in custom manner
class Meta:
model = models.two
exclude = ('id')
base_name = 'two'
def get_last_obj(self, instance):
if (isinstance(instance.last_obj, models.one)):
return self.SerializerOne(instance.last_obj).data
else:
return self.SerializerTwo(instance.last_obj).data
last_obj = SerializerMethodField() #Does not work
但是,此解决方案会产生错误“ NoneType对象不可迭代”,并且发生在init中rest_framework / utils / serializers_helpers.py中的super(ReturnDict, self).__init__(*args, **kwargs)
会导致data中rest_framework / serializers.py中return ReturnDict(ret, serializer=self)
处的错误
我不明白为什么调用像obj = Serializer()
这样的嵌套序列化程序有效,但是显式调用obj = Serializer(instance).data
这样的嵌套序列化程序在这种情况下不起作用。谁能弄清楚我做错了什么?谢谢。
我正在使用包含许多领域的模型。有一个字段是属性,它返回模型的实例。类似于以下内容:类A(模型):@属性def ...
[我从here中发现,当使用超链接关系(在我的情况下是SerializerOne和SerializerTwo继承的CustomSerializer)时,必须通过上下文传递请求对象。 obj = Serializer()
有效但obj = Serializer(instance).data
不起作用的原因是,在前一种情况下,请求对象是通过DRF通过上下文自动添加的。在后者中,它被显式调用,因此您必须手动将上下文与请求对象一起传递。因此,为了使它正常工作,我做了: