1

我在Django 1.10版本Django的ORM select_related呈現模板

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」。我發現很難顯示遊戲及其係數。

+0

你能更詳細地描述問題嗎? –

+0

我使用俄語版本 [link](http://ru.stackoverflow.com/questions/613180/select-related-%D0%9A%D0%B0%D0%BA-%D0%B2%D1%8B %D0%B2%D0%B5%D1%81%D1%82%D0%B8-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C-%D0%BA - %D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%B9-%D0%BF%D1%80%D0%B8%D0%B2%D1%8F %D0%B7%D0%B0%D0%BD%D0%B0-%D0%B4%D1%80%D1%83%D0%B3%D0%B0%D1%8F-%D0%BC%D0%BE %D0%B4%D0%B5%D0%BB%D1%8C-%D0%BF%D0%BE-外國人) –

+0

謝謝。遵循Jann的回答。他的解決方案很好看 –

回答

2

可能更容易爲你的遊戲查詢集發送到模版。

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爲DB-查詢優化

+0

在這種情況下,多少查詢將被髮送到數據庫?一個或多個? –

+0

好點。我添加了一個prefetch_related,它將獲取相關模型並將它們加入到python中(有關解釋,請參閱http://stackoverflow.com/a/31237071/246028) – Jann