【问题标题】:Additional Information in ModelSerializer are not in used ModelModelSerializer 中的附加信息不在使用的模型中
【发布时间】:2026-01-29 12:30:02
【问题描述】:

我有一个类似的问题:Additional (non model) fields in ModelSerializer

我想用这样的模型序列化器创建一个对象:

class CreateUserSerializer(serializers.ModelSerializer):
    user = serializers.CharField(source="username")
    password = serializers.CharField()
    password2 = serializers.WritableField() 
    ...

    class Meta:
         model = User
     fields = ('user', "password", "password2", ...)

显然,我对保存密码2不感兴趣,只是为了比较。

理想情况下,这应该可以解决问题,但由于某些原因,它无法按预期工作:

def restore_object(self, attrs, instance=None):
    tags = attrs.pop('password2', None)
    obj = super(CreateUserSerializer, self).restore_object(attrs, instance)
    obj.tags = tags
    logging.info(u"Object gets restored, field 'password2' gets removed,  list with arguments for object: {0}".format(tags))
    return obj

我得到的错误是:

'User' object has no attribute 'password2'
 ...
 /home/jan/projekte/alarmapp/eclipse_workspace/AlarmServer/AlarmApp/src/external/rest_framework/fields.py in get_component

55. val = getattr(obj, attr_name)

知道为什么这不起作用吗?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    似乎this small Gist 应该会有所帮助:

    from django.contrib.auth.models import User
    from rest_framework import serializers
    
    class CreateUserSerializer(serializers.ModelSerializer):
        password2 = serializers.CharField()
    
        def validate_password2(self, attrs, source):
            password2 = attrs.pop(source)
            if attrs['password'] != password2:
                raise serializers.ValidationError('password mismatch')
            return attrs
    
        def to_native(self, obj):
            self.fields.pop('password2')
            return super(CreateUserSerializer, self).to_native(obj)
    
        class Meta:
            model = User
    

    【讨论】: