Менеджер объектов Django только для чтения? - PullRequest
0 голосов
/ 20 декабря 2010

Я занимаюсь агрессивным кэшированием и хочу убедиться, что никто случайно не напишет код, который напрямую обновляет базу данных. Я бы предположил, что способ решить эту проблему - переименовать обычный диспетчер объектов .rw_objects для использования кешей и заменить .objects диспетчером, который регистрирует предупреждение об отсутствии обновления и выдает исключение, если кто-то пытается сделать обновление из него.

Я написал диспетчер объектов и набор запросов, но я не уверен, как проверить, обновляет ли запрос базу данных.

Есть предложения?

1 Ответ

1 голос
/ 20 декабря 2010

Здесь я подумываю о двух подходах.

  1. Создайте собственный менеджер, переопределите _insert(), _update(), чтобы вызвать исключение / зарегистрировать запрос, и get_query_set(), чтобывернуть пользовательский QuerySet, который переопределяет create(), get_or_create() и update().

  2. Если вы используете django 1.2, создайте другое соединение с базой данных в settings.py назовите его "READ_ONLY" и создайте пользовательский менеджер, который возвращает QuerSet с использованием этого соединения (например, def get_query_set() return super(ReadOnlyManager, self).get_query_set().using("READ_ONLY"), и отметьте соединение только для чтения. (Один из способов сделать это - создать пользователя только для чтения для соединения с базой данных "READ_ONLY" ....Если вы используете Postgres, вы можете делать такие вещи, как Как создать пользователя только для чтения в PostgreSQL? )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...