Django Diango:验证模型对象';保存/删除前根据用户定义的规则设置字段值

Django Diango:验证模型对象';保存/删除前根据用户定义的规则设置字段值,django,Django,我需要为现有项目开发一个新功能。该功能是在数据库中保存/删除之前,根据一些管理员用户定义的规则检查模型实例字段值的有效性。我知道django提供了一种表单字段验证机制,我可以在其中定义自定义逻辑,但这似乎不是正确的方法,因为定义了规则的模型和字段是不可预测的,并且不是所有模型都有相应的表单。我想我最好用一个例子来描述整个场景 有一个管理员用户定义的三条规则如下,这些规则存储在数据库中 Rule 1: model: Book field: author operator:

我需要为现有项目开发一个新功能。该功能是在数据库中保存/删除之前,根据一些管理员用户定义的规则检查模型实例字段值的有效性。我知道django提供了一种表单字段验证机制,我可以在其中定义自定义逻辑,但这似乎不是正确的方法,因为定义了规则的模型和字段是不可预测的,并且不是所有模型都有相应的表单。我想我最好用一个例子来描述整个场景

有一个管理员用户定义的三条规则如下,这些规则存储在数据库中

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)。老实说,我不确定这是否会有帮助,但概念是您可以在管理站点中注册任何内容,因此我的方法是在权限和用户模型之间创建某种中介模型“规则”,然后向管理站点注册,并为其构建一个易于使用的自定义表单。我认为这是一个方向,但我承认我从未做过类似的事情,所以我不完全确定你想做什么是可能的