Django сложный фильтр через ManyToManyField и ForeignKey

У меня есть несколько вкладок базы данных, которые связаны через многие и внешние ключевые поля.

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=20)

class Bookings(models.Model):
    user = user = models.ForeignKey(
        User, 
        blank=True, 
        null=True, 
        on_delete=models.SET_NULL)


class Event(models.Model):
    bookings = models.ManyToManyField(
        Booking, 
        related_name="event_bookings", 
        blank=True)

class ScheduleManager(models.Manager):

    def for_user(self, user):
        """
        Returns a Schedule queryset for a given user object.
        Usage:
            user= User.objects.first()
            Schedule.objects.for_user(user)
        """
        qs = self.get_queryset()
        #need to extend this to return Schedule qs
        return qs


class Schedule(models.Model):
    event = models.ForeignKey(
        Event, 
        on_delete=models.CASCADE
    )

    objects = ScheduleManager()

Я хотел бы запросить базу данных для вывода набора запросов Schedule для заданного объекта User, вызвав Schedule.objects.for_user(User).

Я играл с комбинацией prefetch_related и select_related безрезультатно.

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

Любая помощь будет оценена по достоинству.

Вы можете перемещаться по полям, разделяя их __.

Вы хотите добраться до User из Schedule, маршрут следующий:

Расписание --> Событие --> Бронирование --> Пользователь

Итак, если вы начинаете с Schedule, вы можете отфильтровать пользователей, сделав следующее:

my_user = get_user_object().objects.get(pk=1)
user_schedules = Schedule.objects.filter(event__bookings__user=my_user)

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

class ScheduleManager(models.Manager):

    def for_user(self, user):
        """
        Returns a Schedule queryset for a given user object.
        Usage:
            user= User.objects.first()
            Schedule.objects.for_user(user)
        """
        qs = self.get_queryset()
        qs = qs.filter(event__bookings__user=user)
        return qs
Вернуться на верх