是否可以将Django模型设为只读?没有创建,更新等。
N.B。这个问题与以下内容不同:
Make a Django model read-only?(这个问题允许创建新记录)
Whole model as read-only(仅关注Django管理界面 - 我希望模型只能在整个应用中阅读)
答案 0 :(得分:17)
覆盖模型的保存和删除方法。您打算如何向模型添加对象?
def save(self, *args, **kwargs):
return
def delete(self, *args, **kwargs):
return
答案 1 :(得分:4)
为了采取更多预防措施,您的模型是只读的,您可以使用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操作绕过了delete
和save
方法。
有关使用数据库路由器的更详细说明,请参阅Django - how to specify a database for a model?中的JuanJoséBrown的答案。
然而,即使是数据库路由器方法似乎也存在漏洞,即有一些方法可以从Django发送绕过路由器代码的SQL。要绝对确定只读取一些内容,您应该为数据库用户设置权限。 This question描述了如何设置一个只读的postgreql用户,然后由Django在settings.DATABASES
中设置数据库用户。
答案 2 :(得分:1)
通过这是一个非常古老的问题 - 它将是有用的: https://docs.djangoproject.com/en/dev/ref/models/options/#managed
如果为False,则不会对此>>>模型执行数据库表创建或删除操作。如果模型表示现有表或通过其他方式创建了>>>的数据库视图,这将非常有用。