2016-11-11 14 views
1

Djangoモデルのsaveメソッドをオーバーライドして、多対多フィールドの制限をチェックする際に問題があります。ManyToManyFieldでDjangoモデルのsaveメソッドをオーバーライドするときの問題

は、私は次のモデルがあるとしましょう:

class Person(models.Model): 
    name = models.CharField() 

class ClothingItem(models.Model): 
    description = models.CharField() 
    owner = models.ForeignKey(Person) 

class Outfit(models.Model): 
    name = models.CharField() 
    owner = models.ForeignKey(Person) 
    clothing_items = models.ManyToManyField(ClothingItem) 

私は与えられた服の各ClothingItemOutfit自体と同じ所有者を持っていることを保証Outfitsave方法に制限をつけたいと思います。

I.e.

class Outfit(models.Model): 
    name = models.CharField() 
    owner = models.ForeignKey(Person) 
    clothing_items = models.ManyToManyField(ClothingItem) 

    def save(self, *args, **kwargs): 
     for ci in self.clothing_items: 
      if ci.owner != self.owner: 
       raise ValueError('You can only put your own items in an outfit!) 
     super(Outfit, self).save(*args, **kwargs) 

が、私はここで間違って何が起こっているのか<Outfit: SundayBest>" needs to have a value for field "outfit" before this many-to-many relationship can be used.

任意のアイデアについてのエラーが出ることをしようとすると:私が書きたいのですが?

答えて

2

ここには2つの問題があります。あなたの質問に直接答えるためには、基本的に次のような意味があります。元のオブジェクト(ここではOutfitのインスタンス)がデータベースに保存されていない場合、m2m関係を参照することはできません。

あなたはsave()メソッドで検証をしようとしているようですが、これはdjangoのかなり悪い習慣です。検証プロセスは通常、で実行され、Outfitのオブジェクトが作成されます。デフォルトのdjango形式をオーバーライドするには、django ModelAdmin.formを参照してください。 djangoフォームで検証を行う方法を理解するには、ModelForm validationをチェックしてください。

m2m検証でコードを参照したい場合は、good example from SOが見つかりました。

関連する問題