24

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

注意这个问题不同于:

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

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

4

3 回答 3

26

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

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

def delete(self, *args, **kwargs):
     return
于 2012-08-28T11:39:55.280 回答
11

数据库路由器

要采取更多预防措施,您的模型是只读的,您可以使用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

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

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

设置数据库用户的权限

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

于 2018-01-10T18:41:01.220 回答
-3

您可以managed = False在模型中设置Meta

from django.db import models

class MyReadOnlyModel(models.Model):
    class Meta:
        managed = False

如果False,则不会对该模型执行任何数据库表创建或删除操作。如果模型表示现有表或已通过其他方式创建的数据库视图,这将很有用。

https://docs.djangoproject.com/en/dev/ref/models/options/#managed

于 2014-11-12T17:15:05.507 回答