Как сделать запрос по нескольким моделям в Django
Я использую Django и хочу знать, как получить объекты через 3 модели. Вот мои модели
class Participant(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
is_leader = models.BooleanField(default=False)
team = models.ForeignKey(Team, on_delete=models.CASCADE, null=True, related_name="participants")
application_date = models.DateField(auto_now_add=True, null=True)
resolution_date = models.DateField(null=True, blank=True)
accepted = models.BooleanField(default=False)
class Team(models.Model):
name = models.TextField(default="")
is_public = models.BooleanField(default=False)
institution = models.ForeignKey(Institution, on_delete=models.CASCADE, null=True, related_name='teams')
campaign = models.ForeignKey(Campaign, on_delete=models.CASCADE, null=True, related_name='teams')
class Campaign(models.Model):
name = models.TextField(default="")
description = models.TextField(default="")
initial_date = models.DateTimeField(auto_now_add=False, null=True, blank=True)
end_date = models.DateTimeField(auto_now_add=False, null=True, blank=True)
qr_step_enabled = models.BooleanField(default=True)
image_resolution = models.IntegerField(default=800)
sponsor = models.ForeignKey(Sponsor, on_delete=models.CASCADE, null=True, related_name='campaigns')
У меня есть пользователь через запрос, и я хочу получить все кампании этого пользователя. Я пытался сделать это с помощью циклов for, но я хочу сделать это с помощью запросов. вот что у меня было:
user = request.user
participants = user.participant_set.all()
for participant in participants:
participant.team.campaign.name
есть ли способ сделать запрос через эти модели и для всех участников? У пользователя может быть много участников, и у каждого участника есть Команда, у каждой команды есть кампания
Лучший способ - объединить две модели Team
и Campaign
в одну модель.
Должно сработать что-то простое вроде этого:
Campaign.objects.filter(team__participant__user=request.user)
Django ORM достаточно умна, чтобы отслеживать отношения внешних ключей в обоих направлениях.
Спасибо Daniel W. Steinbrook, который направил меня к ответу, я должен был сделать следующее, чтобы получить запрос:
Campaign.objects.filter(teams__participants__user__exact=request.user)