2011-03-21 42 views
2

我有3個模型類:通過ForeignKey的向後過濾和轉發

class Team(models.Model): 
    name = models.CharField(max_length=100, default="", blank=True, null=True) 
    number = models.IntegerField() 

class Position(models.Model): 
    match = models.ForeignKey('Match') 
    color = models.CharField(max_length=5) 
    number = models.IntegerField() 

    team = models.ForeignKey('Team') 

class Match(models.Model): 
    type = models.CharField(max_length=3) 
    number = models.IntegerField() 

    red_score = models.IntegerField(default=0) 
    blue_score = models.IntegerField(default=0) 

    match_events = models.TextField(max_length=1000) 

使用的模型,因爲他們現在是正確的,我如何能得到匹配的列表中的球隊贏得了(即如果球隊屬於一個紅色的位置,如果它的匹配具有red_score> blue_score,則將其添加到列表中)

對不起,如果這是令人困惑的。如果您有任何具體問題,我可以嘗試澄清一下。

謝謝!

回答

2

最簡單的方式做到這一點:

Match.objects.filter(position__color='red', red_score__gt=F('blue_score')) 

您可能要Position模型移至底部,除去從外鍵關聯的模型名稱撇號。

這是很好的使用多對多關係很好的例子:

class Team(models.Model): 
    name = models.CharField(max_length=100, default="", blank=True, null=True) 
    number = models.IntegerField() 


class Match(models.Model): 
    type = models.CharField(max_length=3) 
    number = models.IntegerField() 
    red_score = models.IntegerField(default=0) 
    blue_score = models.IntegerField(default=0) 
    match_events = models.TextField(max_length=1000) 
    teams = models.ManyToManyField(Team, through='Position', 
            related_name='matches') 


class Position(models.Model): 
    match = models.ForeignKey(Match) 
    color = models.CharField(max_length=5) 
    number = models.IntegerField() 
    team = models.ForeignKey(Team) 

在這種情況下,你會得到更多的選項,以簡化數據訪問,如: 如果team是您的實際團隊和match單匹配選擇代碼中較早的地方,這是有效的:

team.matches.filter(red_score__gt=F('blue_score')) # all won matches of this team 

match.teams.all() # teams involved in this match 
+0

謝謝!每天學些新東西 :-) – Zooey 2011-03-21 07:11:41