【发布时间】:2021-04-04 02:13:19
【问题描述】:
我对 Django 还很陌生,我觉得我一定遗漏了一些东西。我有一个需要两种用户类型(UserType1 和 UserType2)的应用程序。我正在使用带有布尔标志的基本用户模型,然后在这些对象上为用户创建 OneToOne 字段(此时没有添加额外数据)。
这给了我以下用户模型:
from django.conf import settings
from django.contrib.auth.models import AbstractUser, UserManager
from django.core.exceptions import ValidationError
from django.db import models
from django_extensions.db.models import TimeStampedModel
class User(AbstractUser):
"""
Default user model for the platform
"""
email = models.EmailField()
is_user_type_1 = models.BooleanField(default=False)
is_user_type_2 = models.BooleanField(default=False)
# Use default UserManager for now
objects = UserManager()
class UserType1(TimeStampedModel):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
primary_key=True,
related_name='user_type1',
)
class UserType2(TimeStampedModel):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
primary_key=True,
related_name='user_type2'
)
然后我为这些类编写了序列化,我只想公开UserType1 和UserType2(而不是User 本身)的端点。这应该允许用户创建UserType1 或UserType2 的实例,这也将在User 表中创建行(尽管对此可能不是很重要)。以下是序列化程序:
from django.db import transaction
from rest_framework import serializers
from .models import User, UserType1, UserType2
class UserSerializer(serializers.ModelSerializer):
"""
Serializer for the `User` model
"""
class Meta:
model = User
fields = (
'username',
'email',
'password',
'first_name',
'last_name',
'is_active',
)
extra_kwargs = {'password': {'write_only': True}}
class UserType1Serializer(serializers.ModelSerializer):
user = UserSerializer(required=True)
class Meta:
model = UserType1
fields = (
'user',
'created',
'modified',
)
@transaction.atomic
def create(self, validated_data):
user_data = validated_data.pop('user')
user_data.is_user_type_1 = True
user_data.is_user_type_2 = False
user = UserSerializer.create(UserSerializer(), validated_data=user_data)
user_type_1, created = UserType1.objects.update_or_create(
user=user,
)
return user_type_1
class UserType2Serializer(serializers.ModelSerializer):
user = UserSerializer(required=True)
class Meta:
model = UserType2
fields = (
'user',
'created',
'modified',
)
@transaction.atomic
def create(self, validated_data):
user_data = validated_data.pop('user')
user_data.is_user_type_1 = False
user_data.is_user_type_2 = True
user = UserSerializer.create(UserSerializer(), validated_data=user_data)
user_type2, created = UserType2.objects.update_or_create(
user=user,
)
return user_type2
User 模型已在我的设置中注册:
AUTH_USER_MODEL = 'user.User'
创建超级用户后,我可以成功获取我的令牌并使用它们访问其他视图:
{
"refresh": "xxxx",
"access": "xxxx"
}
但是,如果我从管理员创建一个用户(或者我有创建用户和 user_type1/user_type2 对象的装置),每次我尝试获取我得到的令牌时:
{
"detail": "No active account found with the given credentials"
}
但我知道它们存在于数据库中,因为我可以在管理控制台中正确地看到它们。我认为这与密码散列有关,但无法解决。
这还包含以下admin.py 文件:
from django.contrib import admin
from .models import User, UserType1, UserType2
admin.site.register(User)
admin.site.register(UserType1)
admin.site.register(UserType2)
任何帮助将不胜感激!
【问题讨论】:
-
你能显示注册自定义用户模型的 admin.py 文件吗?我猜密码没有被散列,而是纯文本。
-
是的对不起,刚刚编辑添加到上面
标签: django-rest-framework django-rest-framework-simplejwt