- 我知道默认用户模型没有名为“phone”的字段。然而,我试图从默认用户模型中检索所有注册用户,沿着从自定义UserProfile模型中继承的其他字段,如'phone','phone_verified','email_verified','phone_code'和'email_code',该模型使用OneToOneField从默认用户模型继承。为了实现这一点,我创建了一个UserSerializer,它序列化默认的User模型,以及一个嵌套的UserProfileSerializer,它利用了UserSerializer类和UserProfile模型。我的目标是让嵌套的UserProfileSerializer序列化来自用户模型和自定义UserProfile模型的数据。不幸的是,我遇到了以下错误:AttributeError at /register/ -尝试获取序列化程序“UserProfileSerializer”上的字段“user”的值时出现AttributeError。序列化程序字段的名称可能不正确,并且与“User”示例上的任何属性或键不匹配。原始例外文本为:“User”对象没有属性“user”。*
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')
]
1条答案
按热度按时间wn9m85ua1#
我注意到你正在经历几个不同的错误从你的描述。分享整个错误信息可以帮助人们给予更直接的答案!
以下是我想根据常用的django实践提出的一些建议。可能不是最快的解决办法,但可以帮助你的方式,我希望。
'属性错误:在Django中,“User”对象没有属性“phone”
由于django的
User
模型没有phone
字段(在当前可用的Django版本中),因此您添加了UserProfile
模型。我觉得这很好沿着UserProfile
模型,如果您还定义了自己的自定义用户模型(以最简单的形式),它将为您提供更多的灵活性。(ref)可以这么简单:
(and如果定义了自定义用户模型,人们可能会想‘为什么不在这里添加电话字段?是的,但这取决于您的项目的要求。我认为
UserProfile
作为一个单独的模型仍然是一个很好的www. example www.example.com )AttributeError at /register/ -尝试获取序列化程序“UserProfileSerializer”上的字段“user”的值时出现AttributeError。序列化程序字段的名称可能不正确,并且与“User”示例上的任何属性或键不匹配。
“User”对象没有属性“user”。
这些信息似乎不完整,无法找到明确的答案。但是可以帮助解决这类问题的是让django知道“哪个是哪个”,在设置中使用
AUTH_USER_MODEL
和django的get_user_model。我的目标是让嵌套的UserProfileSerializer序列化来自用户模型和自定义UserProfile模型的数据。
我假设代码中嵌套序列化器的意图是使用所需的电话号码实现用户注册。如果是这样的话,我认为在
UserProfile
中添加一个简单的自定义用户模型可以使这变得更容易。并帮助您调试您在此分享的错误。希望这有帮助!