如何将Django模型设为只读?

时间:2012-08-28 11:37:53

标签: django django-models django-orm readonly

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

N.B。这个问题与以下内容不同:

Make a Django model read-only?(这个问题允许创建新记录)

Whole model as read-only(仅关注Django管理界面 - 我希望模型只能在整个应用中阅读)

3 个答案:

答案 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操作绕过了deletesave方法。

有关使用数据库路由器的更详细说明,请参阅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,则不会对此>>>模型执行数据库表创建或删除操作。如果模型表示现有表或通过其他方式创建了>>>的数据库视图,这将非常有用。