2017-02-24 12 views
0

私は3つのモデル:Championship,TeamおよびMatchがあります。 ChampionshipおよびTeamは、ManyToManyFieldと関連しています。これは、各チームが複数の選手権に参加でき、各選手権には多くのチームがいるからです。 各試合はチャンピオンシップにリンクするだけでなく、チャンピオンシップにある2つのチームにリンクする必要があります。Django - Foreign Keyの選択肢を他のモデルの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() 

「チーム1」と「チーム2」が「チャンピオンシップ」にあることを確認したいと思います。また、「チーム1」と「チーム2」は異なっています。

どうすればいいですか?

多分私は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

関連する問題