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
Как я могу перенести эти части из шаблона в просмотр?