我知道默认用户模型没有名为“电话”的字段。但是,我正在尝试从默认用户模型中检索所有注册用户,以及从继承的自定义 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')
]
也许你应该在你使用 USER 模型的 oneToOneField 中添加 related_name,并在 UserProfileSerializer 中使用相同的 related_name 来链接序列化程序。
这一行-
user = UserSerializer(required=True)