Как объединить два набора запросов 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.

Вернуться на верх