Django ошибка ключа сериализатора остальной структуры - PullRequest
0 голосов
/ 24 января 2020

Я использовал стандартную пользовательскую модель Django, но затем требования изменились, и мне пришлось прибегнуть к абстрактной пользовательской модели. Я обновил свой сериализатор, чтобы отразить изменения в полях модели, а также в полях формы, но теперь я получаю сообщение об ошибке при попытке создания объекта пользователя. Сообщение об ошибке KeyError: 'unl_email', но также отображается для всех других полей. validated_data для функции create() в serializers.py кажется пустым, когда я print. Что я делаю не так?

Views.py

class SignUp(CreateAPIView):
    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

    def create(self, request, *args, **kwargs):
        serializer = SignUpSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        return Response({"success": "Registration succesful"}, status=status.HTTP_201_CREATED)

    def perform_create(self, serializer):
        serializer.save()

Models.py

class User(AbstractUser):
    unl_num = models.AutoField(primary_key=True)
    unl_usu_num = models.IntegerField(blank=True,null =True)
    unl_date_added = models.DateField(default=timezone.now)
    unl_name = models.CharField(max_length=256)
    unl_surname = models.CharField(max_length=256)
    unl_email = models.EmailField(max_length=200, unique=True)
    unl_mobile = models.CharField(max_length=256)
    unl_identity= models.CharField(max_length=256)
    unl_oss_num= models.CharField(max_length=256)
    unl_race= models.CharField(max_length=32)
    unl_gender= models.CharField(max_length=32)
    unl_disability= models.CharField(max_length=32)
    unl_location= models.CharField(max_length=256)
    unl_province= models.CharField(max_length=256)
    unl_avatar= models.CharField(max_length=256)

    USERNAME_FIELD = 'unl_email'

Serializers.py

class SignUpSerializer(serializers.Serializer):
    class Meta:
        model = User
        fields = ('unl_email','password','unl_name',
                 'unl_surname','unl_mobile','unl_identity',
                 'unl_oss_num','unl_race','unl_gender','unl_disability',
                 'unl_location','unl_province','unl_avatar'
                 )

        password = serializers.CharField(write_only=True)

    def create(self, validated_data):
        user = User.objects.create(
            unl_email=validated_data['unl_email'],
            unl_name=validated_data['unl_name'],
            unl_surname=validated_data['unl_surname'],
            unl_mobile=validated_data['unl_mobile'],
            unl_identity=validated_data['unl_identity'],
            unl_oss_num=validated_data['unl_oss_num'],
            unl_race=validated_data['unl_race'],
            unl_gender=validated_data['unl_gender'],
            unl_disability=validated_data['unl_disability'],
            unl_location=validated_data['unl_location'],
            unl_province=validated_data['unl_province'],
            unl_avatar=validated_data['unl_avatar']
        )
        user.set_password(validated_data['password'])
        user.save()

        return user

1 Ответ

2 голосов
/ 24 января 2020

Вы используете serializers.Serializer, а затем указываете атрибут модели для этого сериализатора, который он не использует. Вместо этого измените его на serializers.ModelSerializer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...