2012-05-12 16 views
2

私はジャンゴに新たなんだと私はfolowing問題に対処するかどうかはわかりません。Djangoモデル - あるモデルのフィールドを別のモデル(外部キー)のフィールドに依存させる方法

私はモデルを持っている:

class Season(models.Model): 
    number_of_episodes = models.IntegerField() 
class Episode(models.Model): 
    season = models.ForeignKey(Season) 
    number = models.IntegerField() 

エピソード番号のみがシーズン中にユニークなだけでなく、今シーズンのより小さくすべきではありませんnumber_of_episodes。

答えて

2

シーズンのエピソード番号を一意にするには、unique_togetherを使用できます。これは、フィールドのいずれかの値に対して、他のフィールドに値を持つ行が1つだけ存在することを意味します。つまり、この程度になります。

class Season(models.Model): 
    number_of_episodes = models.IntegerField() 
class Episode(models.Model): 
    class Meta: 
     unique_together = (season, number) 
    season = models.ForeignKey(Season) 
    number = models.IntegerField() 

私はあなたのエピソードの数がseason.number_of_episodes未満でなければならないことを強制するためにDjangoのモデルを使用することができるとは思わないが、あなたはオーバーライドされた保存法でそれを行うことができます。

class Season(models.Model): 
    number_of_episodes = models.IntegerField() 

class Episode(models.Model): 
    class Meta: 
     unique_together = (season, number) 
    season = models.ForeignKey(Season) 
    number = models.IntegerField() 

    def save(self, *args, **kwargs): 
     if self.number > season.number_of_episodes: 
      return #Don't save 
     else: 
      super(Episode, self).save(*args, **kwargs) # Call the "real" save() method. 

エピソード番号が間違っている場合、これはセーブ方法から飛び出すだけです。あなたはたぶん例外を発生させるでしょう。

+0

あなたにたくさんありがとう:) – Nicpon

+0

これは正常に動作しますが、私はエピソードに別のフィールドを追加したい:私はときに私はエピソードを追加しようとする 俳優= models.manyToManyField(俳優) は、残念ながら、それは例外が発生します多すぎると:多対多の関係が使用される前に、「「エピソード」インスタンスは主キー値を持つ必要があります。」 なぜそれが何であり、私は何ができるのですか? – Nicpon

+0

最初にオブジェクトにsaveを呼び出し、それにアクターを追加することがあります。エピソード番号が高すぎるエピソードを追加すると、モデルは保存されません(上記のコードを使用した場合)、そのエラーメッセージが表示されます。これは、ManyToManyフィールドにプライマリキーを持つオブジェクトが必要で、オブジェクトが初めて保存されたときにプライマリキーを取得するためです。エピソード番号が高すぎる場合は修復する必要があります。たとえば、例外をスローして(返すのではなく)どこかで処理することができます。 –

関連する問題