2014-02-13 33 views
1

我在Django和捕捉下一期的新手: 例如,我有一個型號:如何避免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())}) 

這是我templete的一部分:

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

因此,當我在「Django工具欄」中看到,每個「遊戲」模板都會查詢並作爲我的案例的摘要,我會得到約200個que里斯!我如何避免這種行爲?

回答

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