【问题标题】:Django query: get value from not directly related modelDjango查询:从不直接相关的模型中获取值
【发布时间】:2017-05-03 23:24:54
【问题描述】:

我想从 Django 中不直接相关的模型中获取价值。 我有以下型号:

class Platform(models.Model):
    platform = models.CharField()


class Game(models.Model):
    game = models.CharField()
    genre = models.CharField()


class Link(models.Model):
    game = models.ForeignKey(Game)
    platform = models.ForeignKey(Platform)

如何获取游戏对象的 QuerySet,其中游戏标题(Game.game 字段)将被替换为以下模式:游戏(平台)(例如“战地(PS3)”)而无需额外点击数据库?

在 SQL 中它看起来像这样:

SELECT
  g.id,
  g.game || ' (' || p.platform || ')' AS game
FROM game g INNER JOIN link l ON g.id = l.game_id
  LEFT JOIN platform p ON l.platform_id = p.id;

【问题讨论】:

    标签: python django django-models django-queryset


    【解决方案1】:

    您可以使用 link_set 来获取游戏的反向查找,这里是 django documentation

    class Platform(models.Model):
        platform = models.CharField()
    
    
    class Game(models.Model):
        game = models.CharField()
        genre = models.CharField()
    
        def save(self, *args, **kwargs):
            self.title = "{0} ({1})".format(self.title, self.link__platform)
            super(Game, self).save(*args, **kwargs)
    
    
    class Link(models.Model):
        class Meta:
            unique_together = ('game', 'platform')
        game = models.ForeignKey(Game)
        platform = models.ForeignKey(Platform)
    

    【讨论】:

    • 谢谢!但我只需要为每个 Game 对象提供一个相关的平台名称:例如。查询集中的 2 项:Battlefield (PS3), Battlefield (PC)不是 Battlefield (PS3, PC)。我怎样才能连接它们?
    • 那么你需要让你链接模型 unique_together 除非你打算添加额外的字段来链接你也可以在游戏模型上添加一个外键,我会根据更新我的答案您是否在链接模型上有额外的字段?
    猜你喜欢
    • 2014-02-21
    • 2022-01-15
    • 2018-09-13
    • 2013-02-17
    • 1970-01-01
    • 2020-08-20
    • 2018-05-25
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多