2017-02-24 111 views
0

我有3个型号:Championship,TeamMatchChampionshipTeamManyToManyField相关,因为每个团队都可以参加多个锦标赛,而且每个锦标赛都有很多团队。 每一场比赛都应该与锦标赛有关,但也应该与两支冠军队相关。Django - 如何限制外键选择到另一个模型中的ManyToMany字段

class Championship(models.Model): 
    name = models.CharField(max_length=100) 
    teams = models.ManyToManyField(Team) 

class Team(models.Model): 
    name = models.CharField(max_length=100) 

class Match(models.Model): 
    championship = models.ForeignKey(Championship) 
    team1 = models.ForeignKey(Team) 
    team2 = models.ForeignKey(Team) 
    score1 = models.PositiveIntegerField() 
    score2 = models.PositiveIntegerField() 

我想确保'team1'和'team2'在'锦标赛'中。而且“team1”和“team2”也不同。

我该怎么做?

也许我可以使用类似Django-smart-selects的东西,但我宁愿避免使用第三方应用程序。

回答

2

您可以在save法做模型验证:

from django.core.exceptions import ValidationError 


class Match(models.Model): 
    championship = models.ForeignKey(Championship) 

    team1 = models.ForeignKey(Team) 
    team2 = models.ForeignKey(Team) 

    score1 = models.PositiveIntegerField() 
    score2 = models.PositiveIntegerField() 

    def save(self, *args, **kwargs): 
     if self.team1 == self.team2: 
      raise ValidationError('The two teams in a match must be distinct') 

     all_teams = self.championship.teams.all() 

     if self.team1 not in all_teams or self.team2 not in all_teams: 
      raise ValidationError('Both teams must be in the championship') 

     return super(Match, self).save(*args, **kwargs) 
+0

谢谢,这正是我一直在寻找。 – Serphone

相关问题