【发布时间】:2019-06-12 04:20:40
【问题描述】:
我正在尝试在连接表上的两个外键之间强制执行约束,但我不知道是否可以使用数据库执行此操作,或者是否应该通过我的应用程序或我的 ORM 执行此操作。
这是我的桌子:
Dataset
Tag
- Dataset: FK
- name: string (eg: "park", "church", etc)
Place
- Dataset: FK
- latitude
- longitude
PlaceTag (my join table)
- Tag: FK
- Place: FK
- note: string (eg: "this place is my favorite park")
我想强制每个 PlaceTag 有一个 Tag 和一个 Place 属于同一个 Dataset。我应该使用数据库还是我的应用程序来执行此操作?或者我应该重新构建模型以更轻松地执行此约束?
FWIW,这是一个开源项目,我创建这些表的 PR 在这里:https://github.com/mapseed/api/pull/161/files 该项目正在使用 Django,如果有帮助的话。
【问题讨论】:
-
简而言之,最佳方法取决于您预期如何使用这些表格。例如,如果所有写入都来自调用
full_clean()的代码(例如表单),那么将您的检查放入PlaceTag.clean()是最有意义的。这是related answer。请注意,Django 在 Django 2.2 中添加了declarative syntax for check contraints。 -
@KevinChristopherHenry 谢谢你的回答。知道在数据库中执行此操作是不合理的,这很有帮助,我可以使用 Django 的模型“强制”执行此操作。但我期待使用 Django 2.2 的 CheckConstraint - 也许这会给我数据库解决方案:)
标签: django database django-models orm model