在Django还是数据库中检查约束条件?

7
考虑性能时,
1)在Python / Django中还是在数据库中实现和检查约束更好?或者两者都可以?
2)在Django中,什么地方最适合检查约束?例如,在模型保存功能中?

该数据库中的约束条件被用于优化查询性能等方面。因此,您可以在任何地方验证约束条件,但我建议保持数据库中的约束条件启用并验证,以便优化器使用。 - haki
1个回答

7
Django已经在数据库层面实现了通用的约束,如主/外键和唯一性(针对单个字段或组合)。对于更具体的约束条件,最好将它们放在Django的model validation methods中。这样,您可以利用Django的特性,例如模型继承和模型表单,而无需在每个继承的模型或表单处理程序中重写约束检查。
您的验证方法的性能将与您设置的一样好。事实上,有些情况下您不必访问数据库,因此性能可能比在数据库层面实现相同限制要好。例如,如果您需要检查要保存的对象中某些模型字段值的组合(而不是针对其他已保存对象进行检查),则无需访问数据库,只需在Python对象级别快速执行检查即可。

6
并发可能会导致不一致性,因为两个不同的线程通过模型验证并写入数据库,彼此不知道,这是否意味着并发可能会导致不一致性?对于直接的“unique”约束条件来说不会,因为这些约束条件是由 Django 推送到数据库中的,但对于依赖其他行的任何其他类型的约束条件来说,可能会出现问题。 - spectras
是的@spectras,没错。目前正在实现数据库级别的检查约束,但还没有完成:https://github.com/django/django/pull/7615 - fjsj
@fjsj 很有趣。我過去一直使用自訂的手寫遷移方式來添加它們。有了 Django orm 的支持會更好。 - spectras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接