2012-03-14 167 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) 
  • 我怎样才能确保至少有一个category设置,没有 重复的上市?
  • 如何确保如果其中一个categories为'出售',则必须设置price_sale否则设置为空?
  • 如何确保插入至少一个image而不是比说10张图像多 ?

我在想这应该在模型中完成,以防我选择从表单中输入数据(类似解析feed),这是否正确?我尝试过处理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'没有?我想避免在没有至少一个m2m关系的情况下插入“列表”。 – RS7 2012-03-14 14:40:08