Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使Django模型为只读?_Django_Django Models_Django Orm_Readonly - Fatal编程技术网

如何使Django模型为只读?

如何使Django模型为只读?,django,django-models,django-orm,readonly,Django,Django Models,Django Orm,Readonly,是否可以将Django模型设为只读?无需创建、更新等 注意:这个问题不同于: (此问题允许创建新记录) (仅涉及Django管理界面-我希望模型在整个应用程序中都是只读的)覆盖模型的保存和删除方法。您计划如何向模型中添加对象 def save(self, *args, **kwargs): return def delete(self, *args, **kwargs): return 您可以在模型的Meta中设置managed=False: from django.db

是否可以将Django模型设为只读?无需创建、更新等

注意:这个问题不同于:

(此问题允许创建新记录)


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

覆盖模型的保存和删除方法。您计划如何向模型中添加对象

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

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

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

from django.db import models

class MyReadOnlyModel(models.Model):
    class Meta:
        managed = False
如果
False
,则不会对此模型执行任何数据库表创建或删除操作。如果模型表示通过其他方式创建的现有表或数据库视图,则此选项非常有用

数据库路由器 要在模型为只读时采取更多预防措施,可以使用该设置禁用每个模型的写入:

# 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操作绕过了
delete
save
方法

有关使用数据库路由器的更详细描述,请参见中的Juan JoséBrown的回答

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

“您打算如何向模型中添加对象?”->可能是纯sql,也可能是从另一个webapp。好的,上述操作应能正常工作。如果需要,您还可以在有人试图保存/删除model.FWIW时引发异常。您还需要定义一个自定义管理器来保护那里的
创建
更新
删除
方法。“您打算如何将对象添加到您的模型?”->有时将非托管模型映射到数据库视图(而不是表)非常方便。这仍然允许插入或删除记录,只跳过创建和删除表这是答案的有效部分,因为只读还应防止数据库迁移。