我是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个查询!我怎么能避免这种行为?
答案 0 :(得分:1)
您可以使用select_related和prefetch_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