0

序列化程序.py:

from rest_framework import serializers
from django.utils.translation import ugettext_lazy as _
import models


class ExtensibleModelSerializerOptions(serializers.Serializer):

    def __init__(self, meta):
        super(ExtensibleModelSerializerOptions, self).__init__(meta)
        self.model = getattr(meta, 'model', None)
        self.read_only_fields = getattr(meta, 'read_only_fields', ())
        self.non_native_fields = getattr(meta, 'non_native_fields',())


class ExtensibleModelSerializer(serializers.ModelSerializerOptions):

    _options_class = ExtensibleModelSerializerOptions

    def restore_object(self, attrs, instance=None):

        for field in self.opts.non_native_fields:
            attrs.pop(field)

        return super(ExtensibleModelSerializer, self).restore_object(attrs, instance)

    def to_native(self, obj):

        ret = self._dict_class()
        ret.fields = {}

        for field_name, field in self.fields.items():
            # --- BEGIN EDIT --- #
            if field_name in self.opts.non_native_fields:
                continue
            # --- END --- #
            field.initialize(parent=self, field_name=field_name)
            key = self.get_field_key(field_name)
            value = field.field_to_native(obj, field_name)
            ret[key] = value
            ret.fields[key] = field
        return ret

class OptiUserSerializer(ExtensibleModelSerializer):
    password_confirmation = serializers.CharField(max_length=models.OptiUser._meta.get_field('password').max_length)
    company_id = serializers.PrimaryKeyRelatedField(queryset=models.Company.objects.all(), many=False)
    password = serializers.CharField(
        style={'input_type': 'password'}
        )

    def validate_password_confirmation(self, attrs, source):
        password_confirmation = attrs[source]
        password = attrs['password']

        if password_confirmation != password:
            raise serializers.ValidationError(_('Password confirmation mismatch'))

        return attrs

    class Meta:
        model = models.OptiUser
        fields = ('id', 'username', 'company_id', 'first_name', 'last_name', 'is_active', 'is_admin', 'password', 'password_confirmation',)
        non_native_fields = ('password_confirmation',)

我正在为我的应用程序定制一个用户模型。我正在使用 DRF 创建 Web 服务。我正在尝试制作如上所述的用户注册序列化程序。一切工作正常,除了当我添加'password_confirmation'字段时它引发异常“model_name”对象没有属性密码确认“。我找到了上面我正在尝试使用的代码片段。但不幸的是,它似乎没有太大帮助。

我的问题是,是否可以添加这样的字段并对其进行一些比较。有什么优雅的方法吗?

请提出修复建议。

谢谢!提前。

4

1 回答 1

1

我认为你不需要ExtensibleModelSerializer。将字段设置为write_only

password_confirmation = serializers.CharField(write_only=True, ...)
于 2015-10-08T13:13:49.747 回答