【问题标题】:Django user profile style auth with Djoser使用 Djoser 的 Django 用户配置文件样式身份验证
【发布时间】:2021-05-30 12:35:59
【问题描述】:

我正在尝试使用djoser 实现身份验证。由于在我的项目开始时我没有从Django 扩展我的AbstractBaseUser,我决定使用一对一的配置文件 关系模式。我有一个单独的用户应用程序,这是我的相关代码:

# 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

我在这里要做的是

  1. 只需向django User 模型添加一个属性即可跳过迁移。
  2. 将 Djoser 序列化程序扩展为仅在创建步骤中创建关系。

但是,当我尝试创建具有向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'"。对当前方法或更好方法的任何帮助都会很棒。

【问题讨论】:

    标签: django serialization django-rest-framework djoser


    【解决方案1】:

    我认为你应该关注这个官方文档:https://docs.djangoproject.com/en/3.1/topics/auth/customizing/

    您的自定义用户应该扩展 AbstractBaseUser 或 AbstractUser 并且您需要使用 create_user(..) 方法自定义 UserManager

    【讨论】:

    • 但这似乎带来了很多麻烦,因为我在项目中有一些已开发的应用程序,并且它们基于 django 的默认身份验证用户进行了迁移。
    猜你喜欢
    • 2018-02-20
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多