只读的Django对象管理器?
我正在进行激进的缓存处理,想确保没人会不小心写代码直接更新数据库。我想,解决这个问题的方法是把正常的对象管理器 .rw_objects
改个名字,用于缓存的使用,然后把 .objects
替换成一个新的管理器,这个管理器在有人尝试读取数据时会发出警告,如果有人试图更新数据,就会抛出一个异常。
我已经写了一个对象管理器和一个查询集,但我不太确定怎么检查一个查询是否在更新数据库。
有什么建议吗?
1 个回答
1
我在考虑两种方法。
创建一个自定义的管理器,重写
_insert()
和_update()
方法,让它们在执行时抛出异常或记录查询日志,同时重写get_query_set()
方法,返回一个自定义的查询集,这个查询集会重写create()
、get_or_create()
和update()
方法。如果你使用的是 Django 1.2,可以在
settings.py
文件中创建另一个数据库连接,叫做"READ_ONLY"
,然后创建一个自定义管理器,使用这个连接返回查询集(比如def get_query_set() return super(ReadOnlyManager, self).get_query_set().using("READ_ONLY")
),并将这个连接标记为只读。实现这一点的一种方法是为数据库连接"READ_ONLY"
创建一个只读用户……如果你使用的是 Postgres,可以参考这个链接了解如何创建只读用户:如何在 PostgreSQL 中创建只读用户?