Django REST Framework:尝试使用序列化程序方法字段中的 serializer.data 构造时出现 "NoneType object is not iterable" 错误?

Django REST Framework: "NoneType object is not iterable" error when trying to use serializer.data construct from within Serializer Method Field?

我正在使用一个包含许多字段的模型。有一个字段是 属性,它 return 是模型的一个实例。类似于以下内容:

class A(Model):
    @property
    def last_obj(self):
        # Returns an object

我遇到的问题是这个 属性 可以 return 2 种不同的模型类型。它可以是 return 类型一的对象,也可以是类型二的对象。这在序列化程序中造成了复杂性。我有一个由嵌套序列化程序组成的序列化程序。这两个对象非常相似,一个序列化器可以用于另一个,但是它们独有的字段没有被序列化。

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 Object is not iterable",它发生在 super(ReturnDict, self).__init__(*args, **kwargs) in rest_framework/utils/serializers_helpers.py in init 导致 return ReturnDict(ret, serializer=self) in rest_framework/serializers.py in data 中的错误

我不明白为什么调用像 obj = Serializer() 这样的嵌套序列化程序可以工作,但是像 obj = Serializer(instance).data 这样显式调用序列化程序在这种情况下不起作用。谁能弄清楚我做错了什么?谢谢。

我从 here 中了解到,在使用超链接关系(在我的例子中是 SerializerOne 和 SerializerTwo 继承自的 CustomSerializer)时,您必须通过上下文传递请求对象。之所以obj = Serializer()有效,而obj = Serializer(instance).data无效,是因为前者是通过DRF通过context自动添加request对象。而在后者中,它被显式调用,因此您必须手动将上下文与请求对象一起传递。所以为了让它工作,我做了:

return self.SerializerOne(instance.last_obj, context={'request': self.context['request']}).data

在序列化程序方法字段内。