我正在尝试使用 djoser 实施身份验证。由于我在项目开始时没有从 AbstractBaseUser
扩展我的 Django
,因此我决定使用一对一配置文件关系模式。我有一个单独的用户应用程序,这是我的相关代码:
# models.py (user and profile models)
from django.db import models
# Create your models here.
from django.db import models
from django.contrib.auth.models import User as BaseUser
class User(BaseUser):
@property
def mobile_number(self):
return self.profile.mobile_number
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile")
mobile_number = models.CharField(max_length=11, unique=True)
def __str__(self):
return self.user.username
# settings.py (djoser settings)
...
DJOSER = {
"SERIALIZERS":{
"user": "user.serializers.UserSerializer"
"current_user": "user.serializers.UserSerializer"
"user_create": "user.serializers.UserCreateSerializer"
}
...
}
...
# user.serializers.py
from rest_framework import serializers
from .models import UserProfile
from .models import User
from djoser.serializers import UserCreateSerializer as BaseUserCreateSerializer
from djoser.serializers import UserSerializer as BaseUserSerializer
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = UserProfile
exclude = ["user"]
class UserSerializer(serializers.ModelSerializer):
mobile_number = serializers.CharField(required=True, allow_blank=False)
class Meta:
model = User
fields = ["username", "email", "first_name", "last_name", "mobile_number"]
class UserCreateSerializer(BaseUserCreateSerializer):
mobile_number = serializers.CharField(required=True, allow_blank=False)
class Meta(BaseUserCreateSerializer.Meta):
fields = ["username", "email", "first_name", "last_name", "mobile_number"]
def create(self, validated_data):
mobile_number = validated_data.pop("mobile_number")
user = super.create(**validated_data)
UserProfile.objects.create(user=user, mobile_number=mobile_number)
return user
我在这里要做的是
django
User
模型添加属性即可跳过迁移。但是,当我尝试使用以下内容创建向 djoser endpoint (auth/users/create)
发送请求的用户时:
{
"username": "user",
"email": "user@examssple.com",
"first_name": "hatef",
"last_name": "madani",
"mobile_number": "01236549879"
}
我收到此错误:"User() got an unexpected keyword argument 'mobile_number'"
。任何对当前方法或更好方法的帮助都会很棒。
答案 0 :(得分:0)
我认为你应该遵循这个官方文档:https://docs.djangoproject.com/en/3.1/topics/auth/customizing/
您的自定义 User 应该扩展 AbstractBaseUser 或 AbstractUser 并且您需要使用 create_user(..) 方法自定义 UserManager