Django ORM select_related 渲染模板

Posted

技术标签:

【中文标题】Django ORM select_related 渲染模板【英文标题】:Django ORM select_related rendering template 【发布时间】:2017-05-25 08:39:24 【问题描述】:

我在 Django 1.10 版本中有这个模型

class Game(models.Model):
    game_code = models.CharField(max_length=10)
    home_team = models.ForeignKey(Team, related_name="home_set", default=2, blank=True, null=True)
    away_team = models.ForeignKey(Team, related_name="away_set", default=2, blank=True, null=True)


class GameCoefficient(models.Model):
    game = models.ForeignKey(Game, default=3)
    win_type = models.CharField(choices=win_type, max_length=250,  blank=True, null=True, default="")
    value = models.FloatField(max_length=250, blank=True, null=True, default="")

在这个 ORM 查询之后

class BaseView(View):
    data = dict()
    template = "index.html"
    def get(self, request):
        self.data['coefficents_and_game'] = GameCoefficient.objects.all().select_related('game')
        return render_to_response(self.template, self.data)

我能够获得系数并展示他们的游戏。现在在模板中显示重复的“game_code”。我发现很难显示游戏及其系数。

【问题讨论】:

你能详细描述一下这个问题吗? 我用俄语版描述link 谢谢。按照詹恩的回答。他的解决方案看起来不错! 【参考方案1】:

将 Game QuerySet 发送到模板可能更容易:

class BaseView(View):
    data = dict()
    template = "index.html"
    def get(self, request):
        self.data['games'] = Game.objects.prefetch_related('gamecoefficient_set').all()
        return render_to_response(self.template, self.data)

使用如下模板:

% for game in games %
   game.game_code 
  % for coeff in game.gamecoefficient_set.all %
     coeff.value 
  % endfor %
% endfor %

更新:为数据库查询优化添加了 prefetch_related

【讨论】:

在这种情况下,将向数据库发送多少查询?一个或多个? 好点。我添加了一个 prefetch_related 它将获取相关模型并将它们加入 python (s.***.com/a/31237071/246028 用于解释)

以上是关于Django ORM select_related 渲染模板的主要内容,如果未能解决你的问题,请参考以下文章

django select_related - 何时使用它

django优化--ORM查询

ORM数据库查询优化only与defer(select_related与prefetch_related)

ORM之select_related 性能相关

orm的select_releated和prefetch_releated介绍

Django 07