Django - 基于表达式的模型约束

时间:2010-06-01 10:03:32

标签: python django

是否可以在django模型对象上设置基于表达式的约束,例如如果我想强加一个约束,其中所有者只能拥有一个给定类型的一个未处于过期状态的窗口小部件,但只要它们已过期就可以拥有多个其他窗口小部件。显然我可以通过覆盖save方法来做到这一点,但我想知道是否可以通过设置约束来完成,例如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 :(得分:2)

这听起来像是Django 1.2中新model validation support的工作。

答案 1 :(得分:0)

不,我认为这不会飞。 model's expecting a tuple of tuples然后检查它的模型基础似乎是grab and compare values,而不是运行表达式。

不过,正如你所说,你可以在save()中进行 - 或者使用模型验证,因为DR指出

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