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 渲染模板的主要内容,如果未能解决你的问题,请参考以下文章
ORM数据库查询优化only与defer(select_related与prefetch_related)