DRF @property字段序列化程序在尝试获取序列化程序Y上字段X的值时出现AttributeError

时间:2017-09-02 17:38:54

标签: python django serialization django-rest-framework

我使用django rest框架来序列化并更新@property字段,但我收到了错误:

AttributeError: Got AttributeError when attempting to get a value for field `template` on serializer `PublicationSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Publication` instance.
Original exception text was: 'NoneType' object has no attribute 'template'.

我有以下型号:

class Publication(models.Model):
    @property
    def template(self):
        return self.apps.first().template

class App(models.Model):
    publication = models.ForeignKey(Publication, related_name='apps')
    template = models.ForeignKey(Template, blank=True, null=True)

class Template(models.Model):
    name = models.CharField(_('Public name'), max_length=255, db_column='nome')

以及以下序列化程序:

class PublicationSerializer(serializers.ModelSerializer):
    template = TemplateSerializer(read_only=False)

    class Meta:
        model = models.Publication
        fields = ('template',)

    def update(self, instance, validated_data):
        template_data = validated_data.pop('template', None)
        instance = super().update(instance, validated_data)
        if template_data:
            instance.apps.all().update(template__id=template_data['id'])
        return instance

当我使用GET方法查看并且我的Publication.apps为空时发生此错误,当我尝试使用POST方法时,我收到一个空的OrderedDict()对象。

这看起来当我的字段为空时,DRF无法发现字段类型,当我尝试POST时,序列化程序也不起作用......

1 个答案:

答案 0 :(得分:1)

看起来您尝试使用的出版物没有相关应用。这就是self.apps.first()返回Noneself.apps.first().template引发异常的原因。尝试将属性更改为:

@property
def template(self):
    return getattr(self.apps.first(), 'template', None)