我有一个Django模型,它有一个开始和结束日期。 结束日期可以为null,如果模型处于活动状态,则将其视为o 正在进行中。
模型的每个实例都有一个由动态列表生成的字段foo。 Foo在实例中并不是唯一的,但是具有相同foo字段的两个实例不能同时处于活动状态。
我正在使用的数据库是PostgreSQL,而afaik无法在数据库级别强制执行。我的选择是在管理员级别强制执行此操作。当我添加模型的新实例时,我想验证此时没有冲突的实例并引发验证错误。当我要在本地测试时,日期时间窗口小部件根本不显示,只显示文本框。
我的问题是,这是实现我想要的最佳方式,如果是这样,为什么缺少日期时间小部件以及如何将其取回?
代码段:
public class MyClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
createDialog(getContext);
}
}
答案 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实例和基于是否添加的布尔值 或改变对象。在这里,您可以进行任何预存或后保存 操作