Django rest framework Имя поля `ia_superuser` недопустимо для модели `CustomUser`.

У меня возникла проблема с написанием пользовательского пользователя в Django an rest framework.Я написал пользовательского пользователя и пользовательский сериализатор, я добавил все необходимое в settings.py. Когда я пытаюсь перейти к пользовательскому приложению, я получаю эту ошибку:

ImproperlyConfigured at /api/user/

Имя поля ia_superuser недопустимо для модели CustomUser.

Метод запроса: GET URL запроса: http://127.0.0.1:8000/api/user/. Версия Django: 3.0.8 Тип исключения: ImproperlyConfigured Значение исключения:

Имя поля ia_superuser недопустимо для модели CustomUser.

Исключение Местонахождение: C:\Users\Aireza.virtualenvs\lcodev-lF6rFvWb\lib\site-packages\rest_framework\serializers.py in build_unknown_field, line 1340 Python Executable: C:\Users\Aireza.virtualenvs\lcodev-lF6rFvWb\Scripts\python.exe Версия Python: 3.10.2 Python Path:

['F:\Python\lcodev\ecom', 'C:\Users\Aireza\AppData\Local\Programs\Python\Python310\python310.zip', 'C:\Users\Aireza\AppData\Local\Programs\Python\Python310\DLLs', 'C:\Users\Aireza\AppData\Local\Programs\Python\Python310\lib', 'C:\Users\Aireza\AppData\Local\Programs\Python\Python310', 'C:\Users\Aireza\.virtualenvs\lcodev-lF6rFvWb', 'C:\Users\Aireza\.virtualenvs\lcodev-lF6rFvWb\lib\site-packages']

Время сервера: Tue, 22 Mar 2022 11:34:45 +0000

У меня есть api приложение в проекте и пользовательское приложение находится в api приложении.

кто-нибудь может помочь? спасибо

здесь все:

user serializer.py:

from rest_framework import serializers
from .models import CustomUser
from django.contrib.auth.hashers import make_password
from rest_framework.decorators import authentication_classes,permission_classes


class UserSerializer(serializers.HyperlinkedModelSerializer):

    def create(self,validated_data):
        password = validated_data.pop('password',None) # pop method removes the given index from the list and returns it
        instance = self.Meta.model(**validated_data)

        if password is not None:
            instance.set_password(password)
        instance.save()
        return instance

    def update(self,instance , validated_data):
        for attr,value in validated_data.item():
            if attr == 'password':
                instance.set_password(value)
            else:
                setattr(instance,attr,value)

        instance.save()
        return instance


    class Meta:
        model = CustomUser
        extra_kwargs = {'password':{'write_only':True}}
        fields = ('name' , 'email' , 'phone' ,'password','is_active' , 'is_staff', 'ia_superuser',)
        read_only_fields = ('email',)

user model.py:

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.


class CustomUser(AbstractUser):
    name = models.CharField(max_length=50,default='user')
    email = models.EmailField(max_length=200 , unique=True)
    phone = models.CharField(max_length=20,blank=True,null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    username = None                # we dont want the user to be logged in by username
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    session_token = models.CharField(max_length=10,default=0)

user views.py:

from rest_framework import viewsets
from rest_framework.permissions import AllowAny
from .models import CustomUser
from .serializers import UserSerializer
from django.http import JsonResponse
from django.contrib.auth import get_user_model,login,logout
from django.views.decorators.csrf import csrf_exempt
import random , re
# Create your views here.


def generate_session_token(length = 10):
    return ''.join(random.SystemRandom().choice(
        [chr(i) for i in range(97,123)] + [str(j) for j in range(10)]
    ) for k in range(length))



@csrf_exempt
def signin(request):
    if not request.method == 'POST':
        return JsonResponse({'error': 'Send a post request with valid paramenter only'})

    # print(request.POST.get('email', None))  - if you will not get email, None will be printed
    username = request.POST['email']
    password = request.POST['password']

    print(username)
    print(password)

# validation part
    if not re.match("^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$", username):
        return JsonResponse({'error': 'Enter a valid email'})

    if len(password) < 3:
        return JsonResponse({'error': 'Password needs to be at least of 3 char'})

    UserModel = get_user_model()

    try:
        user = UserModel.objects.get(email=username)

        if user.check_password(password):
            usr_dict = UserModel.objects.filter(
                email=username).values().first()
            usr_dict.pop('password')

            if user.session_token != "0":
                user.session_token = "0"
                user.save()
                return JsonResponse({'error': "Previous session exists!"})

            token = generate_session_token()
            user.session_token = token
            user.save()
            login(request, user)
            return JsonResponse({'token': token, 'user': usr_dict})
        else:
            return JsonResponse({'error': 'Invalid password'})

    except UserModel.DoesNotExist:
        return JsonResponse({'error': 'Invalid Email'})


def signout(request, id):
    logout(request)

    UserModel = get_user_model()

    try:
        user = UserModel.objects.get(pk=id)
        user.session_token = "0"
        user.save()

    except UserModel.DoesNotExist:
        return JsonResponse({'error': 'Invalid user ID'})

    return JsonResponse({'success': 'Logout success'})


class UserViewSet(viewsets.ModelViewSet):
    permission_classes_by_action = {'create' : [AllowAny]}
    queryset = CustomUser.objects.all().order_by('id')
    serializer_class = UserSerializer

    def get_permissions(self):
        try:
            return [permission() for permission in self.permission_classes_by_action[self.action]]
        except KeyError:
            return [permission() for permission in self.permission_classes]

api migrations 0001_initial.py:

from django.db import migrations
from api.user.models import CustomUser


class Migration(migrations.Migration):
    def seed_data(apps, schema_editor):
        user = CustomUser(name="hitesh",
                          email="hitesh@lco.dev",
                          is_staff=True,
                          is_superuser=True,
                          phone="987654321",

                          )
        user.set_password("12345")
        user.save()

    dependencies = [

    ]

    operations = [
        migrations.RunPython(seed_data),
    ]

user urls.py:

from django.urls import path,include
from rest_framework import routers
from . import views

router = routers.DefaultRouter()

router.register('',views.UserViewSet)

urlpatterns = [
path('login/',views.signin, name = 'signin'),
    path('logout/<int:id>/',views.signout, name = 'signout'),
    path('user/',views.UserViewSet),
    path('',include(router.urls)),
]

settings.py:

Вернуться на верх