只读的Django对象管理器?

1 投票
1 回答
1562 浏览
提问于 2025-04-16 08:48

我正在进行激进的缓存处理,想确保没人会不小心写代码直接更新数据库。我想,解决这个问题的方法是把正常的对象管理器 .rw_objects 改个名字,用于缓存的使用,然后把 .objects 替换成一个新的管理器,这个管理器在有人尝试读取数据时会发出警告,如果有人试图更新数据,就会抛出一个异常。

我已经写了一个对象管理器和一个查询集,但我不太确定怎么检查一个查询是否在更新数据库。

有什么建议吗?

1 个回答

1

我在考虑两种方法。

  1. 创建一个自定义的管理器,重写 _insert()_update() 方法,让它们在执行时抛出异常或记录查询日志,同时重写 get_query_set() 方法,返回一个自定义的查询集,这个查询集会重写 create()get_or_create()update() 方法。

  2. 如果你使用的是 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 中创建只读用户?

撰写回答