Django REST框架:尝试从Serializer方法字段中使用serializer.data构造时出现“ NoneType对象不可迭代”错误?

问题描述 投票:0回答:1

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

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 ...

django-rest-framework django-serializer
1个回答
0
投票

[我从here中发现,当使用超链接关系(在我的情况下是SerializerOne和SerializerTwo继承的CustomSerializer)时,必须通过上下文传递请求对象。 obj = Serializer()有效但obj = Serializer(instance).data不起作用的原因是,在前一种情况下,请求对象是通过DRF通过上下文自动添加的。在后者中,它被显式调用,因此您必须手动将上下文与请求对象一起传递。因此,为了使它正常工作,我做了:

© www.soinside.com 2019 - 2024. All rights reserved.