Как объединить два набора запросов Django, которые сами являются результатами объединений (четыре таблицы)?
У меня есть четыре связанные модели в моем приложении Django, и хотя я освоил базовый и умеренно продвинутый синтаксис запросов, я не могу понять, как заставить работать этот конкретный продвинутый запрос.
Мое приложение - это приложение для составления расписания для команды по горному велосипеду. Для данного мероприятия (таблица 1) я хочу объединить RSVP членов команды (таблица 2) (таблица 3) вместе с их относительным рейтингом (таблица 4) для этого мероприятия (возвращаясь к таблице 1), который является информацией, которую мы используем для группировки участвующих гонщиков по их способностям. Поскольку навыки гонщиков меняются в течение сезона, и мы хотим это отслеживать, их рейтинг - это не одно число, которое мы можем просто хранить как отдельный атрибут в модели TeamMember (хотя это определенно упростило бы данный конкретный запрос).
Вот модели (за вычетом некоторых несущественных деталей для ясности):
class TeamMember(AbstractUser):
class Category(models.TextChoices):
STUDENT = 'S', 'Student Athlete'
PARENT = 'P', 'Parent'
RIDE_LEADER = 'R', 'Ride Leader'
COACH = 'C', 'Coach'
category = models.CharField('Category', choices=Category.choices, max_length=1)
# Also has first_name, last_name, etc from AbstractUser,
# along with some other fields not relevant for this question
class Event(models.Model):
class EventType(models.TextChoices):
PRACTICE = 'P', 'Practice'
RACE = 'R', 'Race'
type = models.CharField('Event type', choices=EventType.choices, max_length=1)
location = models.CharField('Location', max_length=150)
date = models.DateField('Event date', auto_now_add=True)
time = models.TimeField('Event time')
class EventResponse(models.Model):
class Attending(models.TextChoices):
YES = 'Y', 'Yes'
NO = 'N', 'No'
MAYBE = 'M', 'Maybe'
EMPTY = 'E', 'No answer'
member = models.ForeignKey(TeamMember, related_name='event_response', on_delete=models.CASCADE)
event = models.ForeignKey(Event, on_delete=models.CASCADE)
status = models.CharField('Status', choices=Attending.choices, max_length=1)
class RiderRank(models.Model):
member = models.ForeignKey(TeamMember, related_name='rider_rank', on_delete=models.CASCADE)
event = models.ForeignKey(Event, on_delete=models.CASCADE)
rank = models.PositiveSmallIntegerField(blank=True, null=True)
Чтобы получить список ответов для этого события для активных студентов, я выполняю следующий запрос:
responses = (EventResponse.objects.filter(event=event)
.select_related('member') # to reduce # of database queries
.filter(member__is_active=True, member__category=TeamMember.Category.STUDENT.value)
)
Я могу получить список рейтингов для этого события:
event_ranks = RiderRank.objects.filter(event=event)
В итоге я пытаюсь упорядочить список ответов по рангу всадника для данного события. Если бы я делал это в Pandas, я мог бы выполнить еще одно объединение этих двух наборов запросов на RiderRank.member и EventResponse.member, но я не уверен, как это сделать в Django.