Как изменить мой метод 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, если у вас разная бизнес-логика.
Но у меня есть вопрос... Что вы действительно хотите делать с неаутентифицированными пользователями? Показать лучшие курсы? Показывать курсы по странам?