djangorestframework-simplejwt 得到 "No active account found with the given credentials" 虽然我知道我的用户存在

djangorestframework-simplejwt getting "No active account found with the given credentials" although I know my user exists

我对 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'
    )

然后我为这些 类 编写了序列化,我只想公开和终结 UserType1UserType2(而不是 User 本身)。这应该允许用户创建 UserType1UserType2 的实例,这也将在 User table 中创建行(尽管对此可能不是特别重要)。以下是序列化程序:

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)

任何帮助将不胜感激!!

在管理员中注册您的自定义用户模型:

from django.contrib.auth.admin import UserAdmin

admin.site.register(models.User, UserAdmin)

或者按照有关如何在管理员中注册自定义用户模型的文档进行操作。 A full example

通过管理面板创建一个新用户并检查密码是否经过哈希处理。 然后再次 api 调用您的 jwt 端点。