Django模型 - 相关对象验证
问题描述:
我想知道如何对相关对象进行验证。令我惊讶的是,我还没有找到有关这方面的很多相关信息。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进行限制?
答
尝试明确创建您的映射表,并让您的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
这会更用于验证有关'本身连接表行,而不是listing'没有?我想避免在没有至少一个m2m关系的情况下插入“列表”。 – RS7 2012-03-14 14:40:08