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