Django Diango:验证模型对象';保存/删除前根据用户定义的规则设置字段值
我需要为现有项目开发一个新功能。该功能是在数据库中保存/删除之前,根据一些管理员用户定义的规则检查模型实例字段值的有效性。我知道django提供了一种表单字段验证机制,我可以在其中定义自定义逻辑,但这似乎不是正确的方法,因为定义了规则的模型和字段是不可预测的,并且不是所有模型都有相应的表单。我想我最好用一个例子来描述整个场景 有一个管理员用户定义的三条规则如下,这些规则存储在数据库中Django Diango:验证模型对象';保存/删除前根据用户定义的规则设置字段值,django,Django,我需要为现有项目开发一个新功能。该功能是在数据库中保存/删除之前,根据一些管理员用户定义的规则检查模型实例字段值的有效性。我知道django提供了一种表单字段验证机制,我可以在其中定义自定义逻辑,但这似乎不是正确的方法,因为定义了规则的模型和字段是不可预测的,并且不是所有模型都有相应的表单。我想我最好用一个例子来描述整个场景 有一个管理员用户定义的三条规则如下,这些规则存储在数据库中 Rule 1: model: Book field: author operator:
Rule 1:
model: Book
field: author
operator: is
values: Shakespeare
Rule 2:
model: Book
field: publish_date
operator: greater than
values: 2000-1-1
Rule 3:
model: Book
field: publisher.location (Book has a ForeignKey relationship to Publisher)
operator: not in
values: U.K.
<> P>当登录用户想要保存由莎士比亚以外的作者或Publisher位置在英国中编写的书本对象时,我们将拒绝操作,并通知用户他不能完成操作,因为他违反了某些规则。此外,用户可能会查看一些不是莎士比亚创作的书籍,但他无法删除这些书籍
我能想到的一个选择是对所有潜在的规则约束模型使用pre_save,检查模型上是否存在规则,然后在那里进行验证,但这似乎对现有系统有太多的更改,因为我们有很多模型
我想知道是否有任何简单的方法来完成这类工作?django guardian()允许实现每对象权限,但我不确定这是否正是您想要的……谢谢,@yuvi。我知道这个项目。它更像一个细粒度的ACL,但不提供我们可以根据属性定义权限或规则的工具。然后,您也可以在管理站点中注册权限对象(或者更确切地说,创建一个PermissionAdmin类)。这会有帮助吗?我不太明白你的意思,你说的权限对象是什么意思?它是否与我上面描述的权限规则相同?如果是这样的话,我想我们在admin中已经有了它,问题是如何应用它们来检查模型实例。我的意思是将它添加到admin.py:admin.site.register(django.contrib.auth.models.Permission)。老实说,我不确定这是否会有帮助,但概念是您可以在管理站点中注册任何内容,因此我的方法是在权限和用户模型之间创建某种中介模型“规则”,然后向管理站点注册,并为其构建一个易于使用的自定义表单。我认为这是一个方向,但我承认我从未做过类似的事情,所以我不完全确定你想做什么是可能的