python - DRF 使用带有源参数的序列化器更新资源

标签 python django django-rest-framework

我有以下代码。

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/

相关文章:

python - 关于QML和PySide2的几个问题

python - 当您在 Django View 代码中出现无限循环时会发生什么?

Django REST 框架 : require login to view API

django - API Django Rest Framework 上的多对多字段 POST 请求

python - xyzc 值数组,查找第 3 列是否有任何 c 值等于 1 或不为零的行

python - 为什么这个 `else` block 可以工作,但它与 `if` 的情况不在同一级别?

python - JSON 获取嵌套字典中的键路径

python - 模板中使用的 Django URL 名称

python - Django crispy forms - 为多个字段设置标签文本

python - djangorest-framework单例ViewSet