2012-03-14 17 views
1

関連オブジェクトの検証方法を知りたいと思います。私の驚いたことに、私はこれに関する多くの関連情報を発見していない。例えばDjangoモデル関連オブジェクトのバリデーション

class Listing(models.Model): 
    categories = models.ManyToManyField('Category') 
    price_sale = models.DecimalField(max_digits=8, decimal_places=0, null=True) 
    price_rent = models.DecimalField(max_digits=8, decimal_places=0, null=True) 
    price_vacation = models.DecimalField(max_digits=8, decimal_places=0, null=True) 

class Category(models.Model): 
    value = models.CharField(max_length=32) 

class Image(models.Model): 
    listing = models.ForeignKey('Listing') 
    image = models.ImageField(upload_to=get_file_path) 
  • 私は、少なくとも1 categoryが設定されていることを確認することができますどのように、リストには 重複がありませんか?
  • categoriesのいずれかが「販売」の場合、price_saleを設定する必要がありますか、それともnullに設定する必要がありますか?
  • 少なくともimageが挿入されていますが、それ以上の画像が挿入されていないことを確認するにはどうすればよいですか?

フォームからデータを入力することを選択した場合(フィード解析のような)、これがモデルで実行されるべきだと思っていますが、これは正しいでしょうか?私はclean()を扱おうとしましたが、m2mの関係などを扱う前にPKが必要です。

ボーナスの質問:なぜFKによって制限されるのではなく選択肢を使ってフィールドを制限するのですか?

答えて

0

マッピングテーブルを明示的に作成し、ManyToMany関係をthroughこのモデルに設定してみてください。通常のDjangoモデルであるため、ほとんどの検証ロジックをcleanメソッドで定義できるはずです。

class Listing(models.Model): 
    categories = models.ManyToManyField('Category', through='CategoryListing') 
    price_sale = models.DecimalField(max_digits=8, decimal_places=0, null=True) 
    price_rent = models.DecimalField(max_digits=8, decimal_places=0, null=True) 
    price_vacation = models.DecimalField(max_digits=8, decimal_places=0, null=True) 

class Category(models.Model): 
    value = models.CharField(max_length=32) 

class CategoryListing(models.Model): 
    category = models.ForeignKey(Category) 
    listing = models.ForeignKey(Listing) 

    def clean(self): 
     # validation logic 

https://docs.djangoproject.com/en/1.3/topics/db/models/#intermediary-manytomany

+0

これは、よりlisting'ない 'に関連して自身が参加するテーブルの行を検証していないためでしょうか?少なくとも1つのm2mの関係を持たないで 'listing'を挿入しないようにしたいと思います。 – RS7

関連する問題