如何避免django模板中的多余查询?

时间:2014-02-13 00:03:53

标签: python django django-templates

我是Django的新手并抓住下一期: 例如,我有下一个模型:

class Player(model.Model):
    pass

class Game(models.Model):
    player1 = models.ForeignKey(Player, default=None, null=True, blank=True)
    player2 = models.ForeignKey(Player, default=None, null=True, blank=True)

    def is_only_one_player(self):
        if (self.player1 == None) ^ (self.player2 == None):
                return self.white or self.black
            else:
                return None

查看非常简单:

def return_scope(self):
    return render_to_response("temp.html", {"games": list(Game.objects.all())})

这是我的模板的一部分:

....
{% for game in games %}
   {% if game.is_one_player %}
      ... do something

因此,当我在“Django工具栏”中看到时,对于每个“游戏”模板进行查询并作为我的案例的摘要,我得到大约200个查询!我怎么能避免这种行为?

1 个答案:

答案 0 :(得分:1)

您可以使用select_relatedprefetch_related

在你的情况下,它将是:

games = Game.objects.all().select_related('player1', 'player2')

另一个选择是更改is_only_one_player以使用id而不是实际属性。这不会导致ORM命中数据库。

if self.player1_id ^ self.player2_id:
    return self.white or self.black
return None