'AttributeError: 'User' object has no attribute 'phone'' in Django Rest Framework

问题描述 投票:0回答:1

我知道默认用户模型没有名为“电话”的字段。但是,我正在尝试从默认用户模型中检索所有注册用户,以及从继承的自定义 UserProfile 模型中检索其他字段,例如“phone”、“phone_verified”、“email_verified”、“phone_code”和“email_code”使用 OneToOneField 从默认用户模型。为实现这一点,我创建了一个 UserSerializer,它序列化默认的 User 模型,以及一个嵌套的 UserProfileSerializer,它使用 UserSerializer 类和 UserProfile 模型。我的目标是让嵌套的 UserProfileSerializer 序列化来自用户模型和自定义 UserProfile 模型的数据。不幸的是,我遇到以下错误:/register/ 处的 AttributeError - 在尝试获取序列化程序“UserProfileSerializer”上的字段“user”的值时出现 AttributeError。序列化程序字段的命名可能不正确,并且与“用户”实例上的任何属性或键都不匹配。原始的异常文本是:“用户”对象没有属性“用户”。

models.py:

from django.db import models
from django.contrib.auth.models import User


# Create your models here.

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone = models.CharField(max_length=20)
    phone_verified = models.BooleanField(default=False)
    email_verified = models.BooleanField(default=False)
    phone_code = models.CharField(max_length=10)
    email_code = models.CharField(max_length=10)

serializer.py:

from django.core import validators
from rest_framework import serializers
from django.contrib.auth.models import User
from .models import UserProfile
from datetime import datetime


class UserSerializer(serializers.ModelSerializer):
    first_name = serializers.CharField(required=True)
    last_name = serializers.CharField(required=True)
    registration_data = serializers.DateTimeField(
        read_only=True, default=serializers.CreateOnlyDefault(datetime.now())
    )
    password = serializers.CharField(
        required=True,
        write_only=True,
        max_length=128,  # Maximum length for Django password
        error_messages={
            'required': 'Please enter a password.',
            'max_length': 'Password should be no more than 128 characters.'
        },
        validators=[
            validators.MinLengthValidator(8, message='Password must be at least 8 characters.'),
            validators.RegexValidator(
                regex=r'[A-Z]',
                message='Password must contain at least one uppercase letter.',
                code='invalid_password'
            ),
            validators.RegexValidator(
                regex=r'[a-z]',
                message='Password must contain at least one lowercase letter.',
                code='invalid_password'
            ),
            validators.RegexValidator(
                regex=r'[0-9]',
                message='Password must contain at least one number.',
                code='invalid_password'
            ),
            validators.RegexValidator(
                regex=r'[!@#$%^&*()]',
                message='Password must contain at least one special character.',
                code='invalid_password'
            )
        ]
    )

    class Meta:
        model = User
        exclude = ['id']


class UserProfileSerializer(serializers.ModelSerializer):
    user = UserSerializer(required=True)

    class Meta:
        model = UserProfile
        fields = ('user', 'phone', 'phone_verified', 'email_verified', 'phone_code', 'email_code')
        # exclude = ['id']

views.py:

from django.contrib.auth.models import User
from rest_framework import generics
from .serializer import UserSerializer, UserProfileSerializer

class RegisterUserView(generics.CreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('register/', views.RegisterUserView.as_view(), name='register')
]

python django django-models django-rest-framework django-serializer
1个回答
0
投票

也许你应该在你使用 USER 模型的 oneToOneField 中添加 related_name,并在 UserProfileSerializer 中使用相同的 related_name 来链接序列化程序。

这一行-

    user = UserSerializer(required=True)
© www.soinside.com 2019 - 2024. All rights reserved.