#django #filter #django-rest-framework #django-filter
#django #Фильтр #django-rest-framework #django-filter
Вопрос:
Я использую Django REST Framework для реализации системы ассоциативного расписания, в которой пользователь может подписаться на ассоциацию и получать ее события. Каждая ассоциация может иметь много групп (вы выбираете свою, когда подписываетесь на ассоциацию), так что события часто одинаковы для каждой группы, но с разными местами и датами.
Модель выглядит следующим образом :
class Association(models.Model):
name = models.CharField(max_length=40, blank=False, unique=True)
description = models.CharField(max_length=500, blank=False)
class AssocMember(models.Model):
class Meta:
unique_together = (("user", "assoc"),)
user = models.ForeignKey('user.User')
assoc = models.ForeignKey('associations.Association')
is_admin = models.BooleanField(default=False)
group = models.SmallIntegerField(default=-1)
class Event(models.Model):
name = models.CharField(max_length=40, blank=False)
date = models.DateTimeField(blank=False)
assoc = models.ForeignKey('associations.Association')
group = models.IntegerField(blank=True, default=-1)
Мне нужно было бы реализовать get_queryset()
в моем API, который возвращает все события подключенного пользователя, соответствующие его группе. Но для этого мне нужно получить доступ к AssocMember для каждого события во время фильтрации и создать пользовательское условие (как обычно .filter()
в Python)
Каков наилучший способ сделать это с помощью фильтров Django REST?
Заранее спасибо.
Ответ №1:
Проверьте ModelViewSet. Вы можете переопределить get_queryset
метод фильтрации на основе request.user
:
class EventViewSet(viewsets.ModelViewSet):
def get_queryset(self):
group = self.request.user.group # Your models might need adjusting to do this
return Event.objects.filter(group__in=group)
Комментарии:
1. Проблема в том, что переменная «group» зависит от каждого события, потому что событие связано с ассоциацией, а группа пользователя зависит от этой ассоциации). Я нашел какое-то решение, превратив набор запросов в список и используя функцию фильтра python, но это кажется уродливым (я не могу преобразовать список обратно в набор запросов после)