Django 通过相关对象链接查询

Django 通过相关对象链接查询,django,Django,假设场景如下: from django.db import models class Player(models.Model): playername = models.CharField() class Team(models): teamname = models.CharField() class Members(models): player = models.ForeignKey(Player) team = models.ForeignKey(T

假设场景如下:

from django.db import models

class Player(models.Model):
    playername = models.CharField()

class Team(models):
    teamname = models.CharField()

class Members(models):
    player = models.ForeignKey(Player)
    team = models.ForeignKey(Team)

class Division(models):
    divname = models.CharField()  

class DivisionTeam(models):
    division = models.ForeignKey(Division)
    team = models.ForeignKey(Team)

如何列出分区id=5中所有不同的玩家?我已经看过Q和F表达式,但我不是在寻找一组复杂的or。我想知道是否有一种方法可以链接大量的
object1_set.object2_set.all()
类型结构,或者我是否设置了一个嵌套循环来构建对象(通过上下文传递给模板),最终在模板中使用
{%p in players%}
类型循环。div id作为请求变量传递。

您最好先简化模型。我认为您不需要
成员
部门团队
模型:

from django.db import models

class Division(models):
    divname = models.CharField()

class Team(models):
    teamname = models.CharField()
    division = models.ForeignKey(Division)

class Player(models.Model):
    playername = models.CharField()
    team = models.ManyToManyField(Team)
那么,您的查询就是:

Player.objects.filter(team__division__pk=5)
如果您确实需要每个注释的中间模型,则应使用
关系:

# Uses "Salary" as an example intermediate model.
class Player(models.Model):
    playername = models.CharField()
    team = models.ManyToManyField(Team, through="Salary")

class Salary(models.Model):
    value = models.IntegerField()
    player = models.ForeignKey(Player)
    team = models.ForeignKey(Team)
你可以做:

players = Player.objects.filter(members__team__divisionteam__division_id=5).distinct()

当然,正如另一个答案中所建议的,您的模型可以简化(通过使用
ManyToMany
而不是显式管理它)

Uh,
Player.objects.filter(members\uu team\uu division\uu pk=5)
?或者类似的?您的数据库结构令人困惑:我从您使用的单词“distinct”中假设,出于某种原因,您有多个同名玩家,这是问题的关键?有什么原因你不能直接使用它吗?否则,我真的不知道你在问什么。@NightShadeQueen它是基于现有数据库继承的(但我扮演了一个角色),并简化了这个问题。谢谢,我会尝试一下,因为我尝试过的其他一些东西会多次列出同一个球员,因为这些年来他们出现在不止一个球队。我已经读过distinct()的相关内容,但还没讲到使用它的要点。好了,我现在明白了成员是团队和玩家之间的中间模型。这实际上是有道理的——您可能希望将数据存储在Member中,就像球员是团队成员的日期一样。但是您的数据库中不应该有任何重复的player对象,因此您不应该需要distinct()--您只需要进行筛选。我假设OP删除了一些字段,以便使其可读。比如“开始打球的日期”和“薪水”等,这些都会出现在会员模式中,这样玩家就可以成为多个团队的成员。拥有这些中间模型有很多潜在的很好的理由。@foobrabby good point-调整了我的答案以解释这一点。谢谢。作为侧栏,如果顺序稍微关闭,则可能出现“关系字段不支持嵌套查找”错误。结构很难更改,因为某些部分是另一个数据库的视图;并且在某些情况下,中间表中存在添加日期有效类型信息。仍然掌握Django的诀窍,但很喜欢它。实际上,在Django中,这些被称为
通过_表
,您可以在中间表中存储额外的信息。很高兴你喜欢django-它太棒了!通读文档,多对多可能仍然是一条路,但我确实需要m2m表上的额外属性。类似的内容将对我起作用,并稍微简化查询。非常感谢大家。