django admin中的自定义验证会中断datetime小部件

时间:2016-11-21 12:01:44

标签: python django

我有一个Django模型,它有一个开始和结束日期。 结束日期可以为null,如果模型处于活动状态,则将其视为o 正在进行中。

模型的每个实例都有一个由动态列表生成的字段foo。 Foo在实例中并不是唯一的,但是具有相同foo字段的两个实例不能同时处于活动状态。

我正在使用的数据库是PostgreSQL,而afaik无法在数据库级别强制执行。我的选择是在管理员级别强制执行此操作。当我添加模型的新实例时,我想验证此时没有冲突的实例并引发验证错误。当我要在本地测试时,日期时间窗口小部件根本不显示,只显示文本框。

我的问题是,这是实现我想要的最佳方式,如果是这样,为什么缺少日期时间小部件以及如何将其取回?

代码段:

public class MyClickListener implements View.OnClickListener {
    @Override
    public void onClick(View view) {
        createDialog(getContext);
    }
}

1 个答案:

答案 0 :(得分:1)

在数据库级别

  

我使用的数据库是PostgreSQL,而afaik则不能   在数据库级别强制执行。

使用postgresql在数据库级别有很多方法可以做到这一点。 Constraints是你应该首先看到的。虽然像mysql这样的数据库仅限于Unique,Foreign Key和Primary Key约束,但postgresql实际上可以share输入到列中的值。

  

检查约束是最通用的约束类型。它允许你   指定某列中的值必须满足布尔值   (真值)表达。

您可以使用自定义迁移创建约束。但在此之前,您确定这种情况无法通过CHECK上的独特索引来解决吗?

第二件事是创建一个BEFORE INSERT / UPDATE触发器,在数据写入数据库之前对其进行验证。

使用基于postgesql的方法的优点是,如果有人使用PGAdmin修改数据,则仍然会强制执行约束。

在管理级别。

您可能更容易覆盖django模型中的save方法或管理员中的save_model方法来检查约束而不是当前方法。

  

save_model方法给出了HttpRequest,一个模型实例,一个   ModelForm实例和基于是否添加的布尔值   或改变对象。在这里,您可以进行任何预存或后保存   操作