Django REST Framework: фильтрация с помощью другой таблицы

#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, но это кажется уродливым (я не могу преобразовать список обратно в набор запросов после)