如何使Django模型为只读?
是否可以将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管理界面-我希望模型在整个应用程序中都是只读的)覆盖模型的保存和删除方法。您计划如何向模型中添加对象
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时引发异常。您还需要定义一个自定义管理器来保护那里的创建
、更新
和删除
方法。“您打算如何将对象添加到您的模型?”->有时将非托管模型映射到数据库视图(而不是表)非常方便。这仍然允许插入或删除记录,只跳过创建和删除表这是答案的有效部分,因为只读还应防止数据库迁移。