Django - 基于表达式的模型约束
在Django模型对象上设置基于表达式的约束是否可行?比如说,我想设定一个规则:一个拥有者只能拥有一个特定类型的部件,而且这个部件不能处于过期状态,但如果是过期的部件,拥有者可以有很多个。显然,我可以通过重写保存方法来实现这个规则,但我在想是否可以通过设置约束来做到,比如使用某种变体的unique_together约束。
WIDGET_STATE_CHOICES = (
('NEW', 'NEW'),
('ACTIVE', 'ACTIVE'),
('EXPIRED', 'EXPIRED')
)
class MyWidget(models.Model):
owner = models.CharField(max_length=64)
widget_type = models.CharField(max_length = 10)
widget_state = models.CharField(max_length = 10, choices = WIDGET_STATE_CHOICES)
#I'd like to be able to do something like
class Meta:
unique_together = (("owner","widget_type","widget_state" != 'EXPIRED')
3 个回答
0
这就是基于模型的表单验证的核心内容。
你需要定义一个表单,并在里面写一个叫做 clean
的方法,这个方法用来实现一些额外的规则。
创建新的模型对象时,记得总是使用表单的 save
方法,这样才能确保这些对象符合验证规则。
http://docs.djangoproject.com/en/1.2/ref/forms/validation/#ref-forms-validation
http://docs.djangoproject.com/en/1.2/topics/forms/modelforms/#the-save-method
0
不,我觉得这个方法行不通。这个模型需要的是一个元组的元组,而且检查这个模型表单的基础部分似乎是获取并比较值,而不是执行表达式。
不过,正如你所说的,你可以在save()方法中实现这个功能,或者使用模型验证,正如DR所提到的那样。
2
这听起来像是Django 1.2中新增加的模型验证功能可以解决的问题。