我使用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时,序列化程序也不起作用......
答案 0 :(得分:1)
看起来您尝试使用的出版物没有相关应用。这就是self.apps.first()
返回None
和self.apps.first().template
引发异常的原因。尝试将属性更改为:
@property
def template(self):
return getattr(self.apps.first(), 'template', None)