Как Django rest IsAdminUser не проходит, даже если пользователь является администратором?

class Admin(models.Model):
    username = models.CharField(primary_key=True, max_length=30)
    password = models.CharField(max_length=255)
    email = models.EmailField(unique=True)
    created_on = models.DateTimeField(auto_now=True)
    django_user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='admin')
class AdminAPIViewSet(viewsets.ModelViewSet):
    queryset = Admin.objects.all()
    serializer_class = AdminSerializer
    permission_classes = [permissions.IsAdminUser]

    def get_queryset(self):
        if self.request.user.is_authenticated:
            return Admin.objects.filter(username=self.request.user.admin.username)
        else:
            return []

    def create(self, request, *args, **kwargs):
        serializer = AdminSerializer(data=request.data)
        if serializer.is_valid():
            email = serializer.data['email']
            username = serializer.data['email']
            password = serializer.data['password']

            with transaction.atomic():
                django_user = User.objects.create_user(username, email, password)
              
                admin = Admin.objects.create(**serializer.data, django_user=django_user)
                #User.objects.filter(pk=1001).update(is_superuser=True, is_staff=True)

                return Response(admin.pk)

        return Response('/error')


class ClientFullAccessAPIViewSet(viewsets.ModelViewSet):
    queryset = Client.objects.all()
    serializer_class = ClientSerializer
    permission_classes = [permissions.IsAdminUser]

    def create(self, request, *args, **kwargs):
        serializer = ClientSerializer(data=request.data)
        if serializer.is_valid():
            email = serializer.data['email']
            username = serializer.data['email']
            password = serializer.data['password']

            with transaction.atomic():
                django_user = User.objects.create_user(username, email, password)
                client = Client.objects.create(**serializer.data, django_user=django_user)
                return Response(client.username)

        return Response('/error')

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

`

urls.py

from django.contrib import admin
from django.urls import path, include
from rest_framework import routers

import user_management.views

router = routers.DefaultRouter()
router.register(r'clients', user_management.views.ClientReadOnlyAPIViewSet)
router.register(r'clientslist', user_management.views.ClientFullAccessAPIViewSet)
router.register(r'admin', user_management.views.AdminAPIViewSet)


urlpatterns = [
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls')),
    path('api/v1/', include(router.urls)),
    #path('clients/', user_management.views.ClientAPIViewSet.as_view(), name="clients"),
]

enter image description here

Здесь я пытаюсь сделать так, чтобы администратор видел всех клиентов, а клиент видел только свои данные, ... но я не смог найти, почему я не могу видеть всех клиентов из списка как администратор, я продолжаю получать сообщение о том, что я не авторизован для доступа к этой конечной точке... любая помощь, пожалуйста?

Проблема в том, что вы определили свою модель Admin из обычной модели Django, поэтому Django не может найти разрешения пользователя, связанные с ней.

Вы должны наследовать от модели пользователя аутентификации Django (AbstractUser или AbstractBaseUser), как указано в документации .

Например, вы можете сделать:

from django.contrib.auth.models import AbstractUser

class CustomAdminUser(AbstractUser):
    # Here you normally only want to 
    # define the fields not defined in 
    # the base model AbstractUser
    pass 

Затем, чтобы создать своего администратора:

CustomAdminUser.objects.create_superuser(...)

Последние, но не менее важные вещи (упомянутые в приведенной выше ссылке на документацию Django):

  • Не забудьте указать AUTH_USER_MODEL на вашу пользовательскую модель пользователя. Сделайте это перед созданием миграций или первым запуском manage.py migrate.
  • Зарегистрируйте модель в admin.py приложения.
Вернуться на верх