如何将模型设为只读?

Oll*_*ass 16 django readonly django-models django-orm

是否可以将Django模型设为只读?没有创建,更新等

注意这个问题不同于:

将Django模型设为只读?(这个问题允许创建新记录)

整个模型为只读(仅涉及Django管理界面 - 我希望模型只能在整个应用程序中读取)

Mik*_*ael 18

覆盖模型的保存和删除方法.您打算如何在模型中添加对象?

def save(self, *args, **kwargs):
     return

def delete(self, *args, **kwargs):
     return
Run Code Online (Sandbox Code Playgroud)

  • FWIW,你还需要定义一个自定义管理器来保护那里的`create`,`update`和`delete`方法. (9认同)
  • "你打算如何在模型中添加对象?" - >有时将非托管模型映射到数据库视图非常方便,但不是表. (6认同)
  • “您打算如何将对象添加到模型中?” -> 可能在纯 sql 中,或者来自另一个 webapp。 (2认同)

Mar*_*ian 6

数据库路由器

为了进一步预防模型为只读,可以使用DATABASE_ROUTERS设置来禁用每个模型的写入:

# settings.py
DATABASE_ROUTERS = ('dbrouters.MyCustomRouter', )


# dbrouters.py
class MyCustomRouter(object):
    def db_for_write(self, model, **hints):
        if model == MyReadOnlyModel:
            raise Exception("This model is read only. Shame!")
         return None
Run Code Online (Sandbox Code Playgroud)

我认为这是一项保险政策,而不是解决问题的主要方法。例如,Mikael的回答很好,但由于某些Django操作绕过deletesave方法,因此无法涵盖所有​​情况。

请参阅Django中 Juan JuanJoséBrown的答案-如何为模型指定数据库?有关使用数据库路由器的详细说明。

设置数据库用户权限

但是,即使数据库路由器方法似乎也存在漏洞,即,有一些方法可以从Django发送SQL绕过您的路由器代码。为了绝对确保将某些内容设置为只读,您应该对数据库用户设置权限。 此问题描述了如何设置只读postgreql用户,然后可以由Django在中设置数据库用户settings.DATABASES