Как изменить мой метод get_queryset метода Django Rest для приема аутентифицированных пользователей и аутентифицированного пользователя

У меня есть CourseViewSet, который использует миксины для создания, списка, получения и обновления курсов. Сейчас только аутентифицированные пользователи могут перечислять и получать курсы, а пользователи adminUsers могут создавать и обновлять курсы.

Метод get_queryset был переписан для получения списка курсов, которые купили пользователи, и всех курсов.

Выглядит это следующим образом:

courses/views.py

    def get_queryset(self):
        qs = Course.objects.filter(is_active=True, level=0)
        active_levels_prefetch = Prefetch(
            "levels",
            queryset=Level.objects.filter(is_active=True).order_by("is_special"),
        )
        qs = qs.prefetch_related("children", active_levels_prefetch)

        # Add purchased courses amount
        qs = CourseQuerySet._add_purchase_amount_to_qs(qs)

        if self.request.user.is_student():
            self._set_geolocation_params()
            qs = CourseQuerySet.list(qs, self.country)
            print(qs)

        return qs

В моей утилите есть файл permissions.py, который проверяет, являются ли пользователи студентами:


class IsStudent(BasePermission):
    """Verify is user is student."""

    def has_permission(self, request, view):
        # Anonymous user aren't allowed
        if isinstance(request.user, AnonymousUser):
            return False

        return request.user.is_student()

Я также отредактировал метод get_permissions, чтобы он принимал неаутентифицированных пользователей для получения списка курсов:

    def get_permissions(self):
        """
        Instantiates and returns the list of permissions that this view requires.
        """
        if self.request.method == 'GET':
            permission_classes = [AllowAny]
        else:
            permission_classes = [IsAdmin]
        return [permission() for permission in permission_classes]

Когда я попытался получить все курсы без аутентификации, я получил следующую ошибку:

AttributeError: 'AnonymousUser' object has no attribute 'is_student', что очевидно, потому что в моем get_queryset у меня есть эта строка: if self.request.user.is_student(). Я хочу знать, что я могу сделать, чтобы li все курсы без аутентификации и в то же время список всех курсов и купленных курсов для аутентифицированных пользователей. Я уже изменил метод get_permissions, какие у меня есть варианты, чтобы сделать это?

Я пытался изменить набор запросов следующим образом:


courses/views.py
def get_queryset(self):
    qs = Course.objects.filter(is_active=True, level=0)
    active_levels_prefetch = Prefetch(
        "levels",
        queryset=Level.objects.filter(is_active=True).order_by("is_special"),
    )
    qs = qs.prefetch_related("children", active_levels_prefetch)

    if self.request.user == IsAuthenticated : 

        # Add purchased courses amount
        qs = CourseQuerySet._add_purchase_amount_to_qs(qs)


        if self.request.user.is_student():
            self._set_geolocation_params()
            qs = CourseQuerySet.list(qs, self.country)
            print(qs)


        return qs

   elif self.request.user != IsAuthenticated:
   #I don't know what else to do

Лично мне не очень нравится такая архитектура, когда у вас есть ресурс или класс для чего-либо. Если вы поддерживаете такую архитектуру, у вас могут возникнуть головные боли с кодом или мониторинг в prod, тестировании и т.д.

Думаю, лучшим вариантом будет попытка разделить ресурсы для пользователей Auth и Anon, если у вас разная бизнес-логика.

Но у меня есть вопрос... Что вы действительно хотите делать с неаутентифицированными пользователями? Показать лучшие курсы? Показывать курсы по странам?

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