TypeError: User() получил неожиданный аргумент ключевого слова 'is_staff'

Я новичок в django. Я хочу создать API для входа, регистрации, поэтому я нашел решение в интернете. Но оно не использует мою собственную модель User, оно использует django.contrib.auth.models import AbstractUser. Мне не нужно некоторое поле из AbtractUser, поэтому я даю ему =none. Вот код моей модели:

from django.db import models
from django.contrib.postgres.fields import ArrayField
from django.contrib.postgres.fields import JSONField
from django.contrib.auth.models import AbstractUser

# Create your models here.

# class User(models.Model):
#     name = models.CharField(null=False,blank=False, max_length=512)
#     username = models.CharField(null=False,blank=False, max_length=512, unique=True)
#     email = models.EmailField(null=False,blank=False, max_length=512, unique=True)
#     password = models.CharField(null=False,blank=False, max_length=512)
#     status = models.CharField(null=True,blank=True, max_length=512)
#     role = models.IntegerField(null=False, blank=False, default=1)
#     USERNAME_FIELD = 'username'
#     REQUIRED_FIELDS = []
#     def __str__(self):
#         return self.username

class User(AbstractUser):
    last_login = None
    is_staff = None
    is_superuser = None
    first_name = None
    last_name = None
    name = models.CharField(null=False,blank=False, max_length=512)
    username = models.CharField(null=False,blank=False, max_length=512, unique=True)
    email = models.EmailField(null=False,blank=False, max_length=512, unique=True)
    status = models.CharField(null=True,blank=True, max_length=512)
    role = models.IntegerField(null=False, blank=False, default=1)
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.username

class Category(models.Model):
    title = models.TextField(null=False, blank=False)
    description = models.TextField(null=False, blank=False)

 
class Question(models.Model):
    title = models.TextField(null=False, blank=False)
    description = models.TextField(null=False, blank=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    choices = models.JSONField(null=False, blank=False)
    answer = models.TextField(null=False,blank=False)
    level = models.IntegerField(null=True, blank=True)

Но я не могу войти в Django Admin с моим суперпользователем. Я создаю нового суперпользователя, но получаю ошибку TypeError: User() got an unexpected keyword argument 'is_staff'

Моя команда для создания суперпользователя: python manage.py createsuperuser

Я не понимаю, почему моя модель может влиять на суперпользователя моего приложения. Кто-нибудь может объяснить мне и дать мне какое-нибудь решение.

Вот мой код в сериализаторе:

from django.contrib.postgres import fields
from rest_framework import serializers
from app.models import User, Question, Category

class RegistrationSerializer(serializers.ModelSerializer):

    email = serializers.EmailField(max_length=50, min_length=6)
    username = serializers.CharField(max_length=50, min_length=6)
    password = serializers.CharField(max_length=150, write_only=True)
    class Meta:
        model = User
        fields = ['id', 'name','email', 'username', 'password', 'role']
    def validate(self, args):
        email = args.get('email', None)
        username = args.get('username', None)
        if User.objects.filter(email=email).exists():
            raise serializers.ValidationError({'email': ('Email already exists')})
        if User.objects.filter(username=username).exists():
            raise serializers.ValidationError({'username': ('Username already exists')})

        return super().validate(args)
  

    # def create(self, validated_data):
    #     return User.objects.create_user(**validated_data)

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'name', 'username', 'email', 'role']

class CategorySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Category
        fields = ['id', 'title', 'description']

class QuestionSerializer(serializers.ModelSerializer):
    # category = CategorySerializer(read_only=False)
    class Meta:
        model = Question
        fields = ['id', 'description', 'category', 'choices', 'answer', 'level']

Вот мой код в представлениях:

from django.db.models import query
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework import generics
from rest_framework import viewsets
from rest_framework import serializers
from rest_framework import permissions
import uuid
from app.models import User, Category, Question
from app.serializers import UserSerializer, QuestionSerializer,  CategorySerializer, RegistrationSerializer

from django.shortcuts import get_object_or_404

# Create your views here.

class RegistrationAPIView(generics.GenericAPIView):

    serializer_class = RegistrationSerializer
    permission_classes = (permissions.IsAuthenticated,)
    def post(self, request):
        serializer = self.get_serializer(data = request.data)
        if(serializer.is_valid()):
            serializer.save()
            return Response({
                "RequestId": str(uuid.uuid4()),
                "Message": "User created successfully",
                
                "User": serializer.data}, status=status.HTTP_201_CREATED
                )
        
        return Response({"Errors": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)

class ListUsersAPIView(APIView):
    permission_classes = (permissions.IsAuthenticated,)
    def get(self, request):
        listUser = User.objects.all()
        info = UserSerializer(listUser, many = True)
        return Response(data = info.data, status = status.HTTP_200_OK)

    # def post(self, request, format=None):
    #     serializer = UserSerializer(data=request.data)
    #     if serializer.is_valid():
    #         serializer.save()
    #         return Response(serializer.data, status=status.HTTP_201_CREATED)
    #     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class DetailUsersAPIView(APIView):
    permission_classes = (permissions.IsAuthenticated,)
    def get(self,request, id):
        try: 
            user = get_object_or_404(User, pk=id)
            data = UserSerializer(user).data
            return Response(data, status = status.HTTP_200_OK)
        except:
            return Response("Error",status = status.HTTP_404_NOT_FOUND)

    def patch(self, request, id):
        user = get_object_or_404(Users, pk=id)
        serializer = UserSerializer(user, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class CategoryViewSet(viewsets.ModelViewSet):
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = CategorySerializer
    queryset = Category.objects.all()

class QuestionViewSet(viewsets.ModelViewSet):
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = QuestionSerializer
    queryset = Question.objects.all()

Большое спасибо.

Вам потребуется определить свой собственный UserManager [Django-doc] для регистрации пользователя без использования is_staff, is_superuser и т.д. Этот менеджер используется для создания объектов пользователей. Поскольку вы установили такие поля, как is_staff, is_superuser и т.д. в None, они больше не являются полями модели.

Поэтому вы должны реализовать свой собственный менеджер пользователей, который больше не будет пытаться установить эти поля в модели пользователя. Таким образом, это выглядит следующим образом:

from django.contrib.auth.models import UserManager

class CustomUserManager(UserManager):
    def create_user(self, username, email=None, password=None, **extra_fields):
        return self._create_user(username, email, password, **extra_fields)

    def create_superuser(self, username, email=None, password=None, **extra_fields):
        return self._create_user(username, email, password, **extra_fields)

Это UserManager не будет добавлять is_staff и/или is_superuser к используемым полям. Таким образом, вы назначаете CutomUserManager как objects менеджер пользовательской модели:

class User(AbstractUser):
    # ⋮
    objects = CustomUserModel()
Вернуться на верх