我有以下代码。
class UserSerializer(serializers.ModelSerializer):
fax = serializers.CharField(source='primary_address.fax')
class User(models.Model):
primary_address = models.OneToOneField(ProfileAddress, verbose_name=_('Primary address'), null=True, related_name='+')
class ProfileAddress(models.Model):
fax = models.CharField(max_length=255, verbose_name=_('Fax number'), null=True)
mobile = models.CharField(max_length=255, verbose_name=_('Mobile phone number'), null=True)
当我尝试通过发送传真字段更新用户对象时,我会收到错误
Cannot assign "{u'fax': u'0555400123457'}": "User.primary_address" must be a "ProfileAddress" instance.
更新此类字段(定义与相关模型相对应的源参数)的正确方法是什么。可以在该相关模型上定义更多字段,并且它们都应该在 json 输出中表示为字段,而不是嵌套字段。
更新 在序列化器更新中的 valid_data.items 中,我看到以下内容:
(u'primary_address', {u'city': {u'name': u'Berlin'}, u'fax': u'0555400123457', u'url': None, u'line1': u'Sch\xf6nhauser Allee', u'phone': u'0555400123456', u'postal_code': u'PostalCode object', u'email': u'abv@gmsail.comso'}), (u'title', u'Herr')
显然,来自 ModelSerializer 的更新代码:
for attr, value in validated_data.items():
setattr(instance, attr, value)
只会尝试使用字典值设置primary_address属性,并且会失败。
最佳答案
您应该重写update
函数来自行更新primary_address.fax
。
class UserSerializer(serializers.ModelSerializer):
fax = serializers.CharField(source='primary_address.fax')
def update(self, instance, validated_data):
fax = validated_data.pop('fax', None)
super(UserSerializer, self).update(instance, validated_data)
if fax is not None:
instance.primary_address.fax = fax
instance.primary_address.save(update_fields=('fax',))
return instance
关于python - DRF 使用带有源参数的序列化器更新资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36033987/