具有三个深层嵌套模型的Queryset筛选器(多个onetomany关系)

2024-09-28 20:58:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我想弄清楚如何在Django中过滤一些查询,我的模型设置如下:

class Team(models.Model):
    name = models.CharField()

class TeamPosition(models.Model):
    description = models.CharField()
    team = models.ForeignKey(Team)

class Player(models.Model):
    teamposition = models.ForeignKey(TeamPosition)
    team = models.ForeignKey(Team)
    joined_date = models.DateField()
    left_date = models.DateField(blank=True, null=True)
    person = models.ForeignKey(Person)

class Person(models.Model):
    name = models.CharField()

我想找到回答这些问题的问题集(为了清楚起见,移到下面):

如果我从TeamPosition对象开始,它就更容易理解(但是没有给我一个团队的查询集)。在

样本数据集:

对象集1:

^{pr2}$

对象集2:

Team(name="Pears")
    TeamPosition(team="Pears", description="Forward")
        Player(team="Pears", teamposition="Forward", joined_date="2014-01-01", left_date=null, person="Carol")
    TeamPosition(team="Pears", description="Defense")
        Player(team="Pears", teamposition="Defense", joined_date="2015-01-01", left_date=2017-01-01, person="Bill")
    TeamPosition(team="Pears", description="Goalie")
        Player(team="Pears", teamposition="Goalie", joined_date="2014-01-01", left_date=null, person="Susan")

对象集3:

Team(name="Oranges")
    TeamPosition(team="Oranges", description="Forward")
    TeamPosition(team="Oranges", description="Forward")
    TeamPosition(team="Oranges", description="Goalie")

对象集4:

Team(name="Bananas")
    TeamPosition(team="Bananas", description="Forward")
        Player(team="Bananas", teamposition="Forward", joined_date="2014-01-01", left_date=null, person="Joe")
    TeamPosition(team="Bananas", description="Defense")
        Player(team="Bananas", teamposition="Defense", joined_date="2015-01-01", left_date=2017-01-01, person="Angela")
    TeamPosition(team="Bananas", description="Goalie")
        Player(team="Bananas", teamposition="Goalie", joined_date="2014-01-01", left_date="2016-09-30", person="Kelly")

因此,基于这些对象,我期望得到以下结果:

  • 哪些团队有可用的团队位置?(可用表示没有当前玩家的团队位置)

    Queryset should return Object 1 (Apples) and Object 3 (Oranges)

  • 哪些球队的所有队员都有现役球员?(与上述相反)(当前指的是没有左边日期或将来没有左边日期的玩家)

    Queryset should return Object 2 (Pears) and Object 4 (Bananas)

  • 哪支球队在30天内会有空位?在

    Queryset should return Object 4 (Bananas)

希望这能让事情变得更清楚。在

注:之前有一个汽车的例子(因此第一反应),但它似乎不清楚,所以创造了一个更好的例子


Tags: 对象datemodelsdescriptionleftteampersonforward
1条回答
网友
1楼 · 发布于 2024-09-28 20:58:39

在回答之前,先问一个问题:行carmodel = models.ForeignKey(Model)可以吗?或者应该改为ForeignKey(CarModel)

尝试此查询(这将为您提供所有CarCompany对象,其CarModelYear的last_availability日期在将来:

from datetime import datetime
CarCompany.objects.filter(carmodel__modelyear__last_availability__gte=datetime.now())

为了检查last_availability是在将来还是空白/空,我将使用Q objects

^{pr2}$

对于您的第二个示例,我无法思考,但是在同一个查询中(它回答了您的问题Which Teams have open TeamPositions?和{})

但我不确定你说的Which Teams have no TeamPositions without current Players?是什么意思如果你能解释一下。。。在

Team.objects.filter(Q(teamposition__player__left_date__gte=datetime.now()) |
                    Q(teamposition__player__left_date__isnull=True) |

相关问题 更多 >