首页 > 解决方案 > Django 更好地加入

问题描述

这是我的模型。这就像一个运动队组织应用程序。赛事模型是类似于棒球比赛的体育赛事。任何人都可以属于多个团队。因此,团队成员代表团队的成员。

class Team(models.Model):
    name = models.CharField(max_length=100, blank=True)

class TeamMember(models.Model):
    member = models.ForeignKey(User, on_delete=models.CASCADE)
    team = models.ForeignKey(Team, on_delete=models.CASCADE)

class Event(models.Model):
    team = models.ForeignKey(Team, on_delete=models.CASCADE)

我想获取我的团队所拥有的事件列表。

def get_queryset(self):
    teams = TeamMember.objects.filter(member=self.request.user).values('team')
    return Event.objects.filter(team__in=teams)

这确实有效,但我想让它成为一个单一的连接。我的 ORM-fu 没那么好。

标签: djangojoinorm

解决方案


正如文档所说

Django 提供了一种强大而直观的方式来“跟踪”查找中的关系,在幕后自动为您处理 SQL JOIN。要跨越关系,请跨模型使用相关字段的字段名称,用双下划线分隔,直到找到所需的字段。

...

它也可以向后工作。要引用“反向”关系,请使用模型的小写名称。

Event.objects.filter(team__teammember__member=self.request.user)

推荐阅读