Django模型 - 相关对象验证

时间:2012-03-14 01:56:28

标签: python django validation django-models model

我想知道如何对相关对象进行验证。令我惊讶的是,我没有找到相关的相关信息。

例如:

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之一是' sale ',我必须确定image必须设置或设置为空?
  • 如何确保插入至少一个clean()但不多 比说10张图片?

我认为这应该在模型中完成,以防我选择输入表单之外的数据(比如解析一个feed),这是正确的吗?我试过处理{{1}},但在让我处理m2m关系等之前需要PK。

奖金问题:为什么我会选择使用选择限制字段而不是限制FK?

1 个答案:

答案 0 :(得分: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