【问题标题】:Django - Expression based model constraintsDjango - 基于表达式的模型约束
【发布时间】:2010-06-01 10:03:31
【问题描述】:

是否可以在 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')

【问题讨论】:

    标签: python django


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      不过,正如您所说,您可以在 save() 中执行此操作 - 或使用模型验证,正如 DR 指出的那样

      【讨论】:

        【解决方案3】:

        这就是基于模型的表单验证的全部意义所在。

        使用实现这些附加规则的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

        【讨论】:

          猜你喜欢
          • 2021-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-14
          • 1970-01-01
          • 2019-02-15
          • 1970-01-01
          相关资源
          最近更新 更多