Django - Как фильтровать вложенные циклы в представлениях

{% for race_team in race_team_list %}
    <tr>
        <td>{{ race_team.tactic }}</td>
        <td>{{ race_team.token }}</td>
        <td>{{ race_team.budget }}</td>
        <td>{{ race_team.team.name }}</td>
        {% for team_race_driver in race_team.team.race_drivers.all %}
            {% if team_race_driver.race == race %}
            <td>{{ team_race_driver.driver }}
                <small class="text-muted d-block">{{ team_race_driver.total_point }}</small>
            </td>
            {% endif %}
        {% endfor %}

    </tr>
{% endfor %}

В моем шаблоне Django эта часть помещает каждую строку базы данных в модели RaceTeam в строку таблицы и для каждого водителя, участвующего в гонке, добавляет этих водителей в строку. race_team_list - это контекст, который включает команды только этой конкретной гонки (допустим, 1-й гонки). Однако в race_team.team.race_drivers.all перечисляются все экземпляры race_driverswhich, которые были у команды, например, у моей команды был водитель A в гонке1 и гонке2, водительB только в гонке2. Для того чтобы отфильтровать экземпляры с race2, у меня есть блок if в шаблоне, но я не думаю, что это лучший способ разместить логику кода, которая должна быть в views.py. Однако я не могу поместить ее в views.py, потому что не могу отфильтровать экземпляры race_team.team.race_drivers.

Я думал об объединении экземпляров race_team и race_driver или создании тернарного отношения RaceDriverTeam, но из-за наличия атрибутов в таблицах RaceTeam и RaceDriver, я не думаю, что это лучший способ смешать все в одной таблице.

Мои модели и представления выглядят так:

class Race(models.Model):
    name = models.CharField(max_length=255)
    championship = models.ForeignKey(Championship, on_delete=models.RESTRICT, related_name='races', null=True)
    round = models.IntegerField()
    ...
    drivers = models.ManyToManyField(Driver, through='RaceDriver', related_name='attended_races')
    teams = models.ManyToManyField('Team', through='RaceTeam', related_name='races_involved')

class RaceDriver(models.Model):
    race = models.ForeignKey(Race, on_delete=models.CASCADE, related_name='driver_instances')
    driver = models.ForeignKey(Driver, on_delete=models.RESTRICT, related_name='race_instances')
    price = models.DecimalField(max_digits=3, decimal_places=1)
    ...

class Team(models.Model):
    account = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, related_name="teams")
    championship = models.ForeignKey(Championship, on_delete=models.CASCADE, related_name="teams", null=True)
    name = models.CharField(max_length=255)
    race_drivers = models.ManyToManyField(RaceDriver, related_name='teams', blank=True)

class RaceTeam(models.Model):
    race = models.ForeignKey(Race, on_delete=models.CASCADE, related_name='team_instances')
    team = models.ForeignKey(Team, on_delete=models.CASCADE, related_name='race_instances')
    token = models.IntegerField()
    budget = models.DecimalField(max_digits=4, decimal_places=1)
    tactic = models.CharField(max_length=8)


Просмотров:

class RaceDetailView(DetailView):
    model = Race

    def get_object(self):
        return get_object_or_404(
            Race,
            championship__slug=self.kwargs.get('slug'),
            round=self.kwargs.get('round')
        )

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["race_driver_list"] = RaceDriver.objects.filter(race=context["race"])
        context["race_team_list"] = RaceTeam.objects.filter(race=context["race"])
        return context

Как я могу перенести эти части из шаблона в просмотр?

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