【问题标题】:Can't figure out join statement in Django无法弄清楚 Django 中的 join 语句
【发布时间】:2013-01-17 16:39:24
【问题描述】:

我试图弄清楚如何在 Django 中执行以下 sql join 语句,而无需仅使用原始 sql。有办法吗?

Select * from playertable, seasontable where player.id = season.player_id

这是我的模型。只是为了澄清,我在上述查询中使用缩写表名来澄清

class Player(models.Model): 
    name = models.CharField(max_length=200)
    team = models.CharField(max_length=3)
    position = models.CharField(max_length=3)

class PlayerSeason(models.Model):

    player = models.ForeignKey(Player)
    year = models.IntegerField()
    games_played = models.IntegerField()
    goals = models.IntegerField()
    assists = models.IntegerField()
    points = models.IntegerField()
    plusminus = models.CharField(max_length=200)
    pim = models.IntegerField()
    ppg = models.IntegerField()
    shg = models.IntegerField()
    gwg = models.IntegerField()
    otg = models.IntegerField()
    shots = models.IntegerField()
    shooting_percentage = models.DecimalField(max_digits=5, decimal_places=2)
    toi = models.CharField(max_length=200)
    sftg = models.DecimalField(max_digits=5, decimal_places=2)
    face_off = models.DecimalField(max_digits=5, decimal_places=2)

我应该如何使用 Django QuerySet 做到这一点?

【问题讨论】:

  • 您的季节模型在哪里?如果您想要一个赛季的所有球员,只需season.player_set.all()
  • 您是否要在一个查询中查询所有球员和所有赛季?或者你想从一名球员那里得到他们的赛季?
  • 我想获取与特定球员相关的所有赛季,然后将其放大,以便我可以对所有球员进行此操作
  • 并且赛季模型被称为 PlayerSeason,很抱歉造成混乱
  • @F.C.把它放在一个答案中,我会把它给你,这正是我需要做的(见编辑)

标签: django django-models django-queryset


【解决方案1】:

如果您只想获取与给定赛季相关联的所有球员,您可以使用Django's backwards relationships

当您将 ForeignKeyField 用于模型(在本例中为 Season)时,该模型实例会获得一个属性,该属性允许您获取所有相关对象的查询集。

在您的示例中,您可以使用season.player_set.all()

您可以将可选参数related_name 传递给ForeignKeyField,以便更改季节属性的名称。

【讨论】:

    【解决方案2】:

    有办法吗?

    没有。 Django 的 ORM 一次处理一个模型,并且您从两个表中获取列。对任一模型执行查询,然后访问相应字段以获取相关模型。

    【讨论】:

    • 请解释一下你的-1。我也有这种印象,也许选民可以澄清一下?
    猜你喜欢
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多