есть ли переключатель, который может отключить / включить любые изменения в моделях django? - PullRequest
1 голос
/ 06 января 2020

Есть ли что-то вроде переключателя / флага, доступного в Django моделях, которые могут включать / отключать любые изменения.

, включив этот переключатель, вы не можете изменить / удалить любой объект модели даже в ссылочных моделях ( связан с внешним ключом) даже не из Django -оболочки.

Ответы [ 2 ]

3 голосов
/ 06 января 2020

Вы можете использовать несколько соединений с базой данных, которые на самом деле просто 2 соединения с одной и той же БД только с разными пользователями. Один с полными разрешениями, а другой - только с правами чтения

settings.py

DATABASES = {
    'default': {
        'NAME': 'foo',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'superuser',
        'PASSWORD': 'superuser',
    },
    'restricted': {
        'NAME': 'foo',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'restricted',
        'PASSWORD': 'restricted',
    }
}

Затем добавьте пользовательский маршрутизатор базы данных , который переключается между 2

class SwitchRouter:

    def _writes_disabled(self):
        return False  # or True if the "switch" has been triggered somehow

    def db_for_write(self, model, **hints):
        if self._writes_disabled():
            return 'restricted'

settings.py

DATABASE_ROUTERS = ['path.to.SwitchRouter']
1 голос
/ 06 января 2020

Поскольку вы просите прекратить вставку даже для Django оболочки, я могу придумать один способ. Должны быть более элегантные методы . Пожалуйста, обратите внимание, что я не пробовал сам, но мое предложение основано на информации здесь . Поэтому было бы неплохо подождать гораздо более опытных членов Stackoverflow.

Я предположил, что вы используете MySQL. Пожалуйста, измените предложенное ниже предложение в соответствии с вашей СУБД.

Для этого вам нужны права администратора базы данных с привилегиями GRANT. Также предположим, что ваше Django имя пользователя в SETTINGS.py - это «abcdef» (в разделе базы данных), а таблица, которую вы хотите ограничить, - «mytable», а база данных - «mydatabase». Я также предполагаю, что вы хотите, чтобы это происходило для доступа с любого IP.

В основном вам придется отозвать права на вставку / удаление , как показано ниже.

REVOKE INSERT, DELETE ON mydatabase.mytable FROM 'abcdef'@'%';

Вы можете повторить процесс для других привилегий.

Чтобы включить, вам необходимо предоставить те же привилегии, что и ниже.

GRANT INSERT, DELETE ON mydatabase.mytable TO 'abcdef'@'%';

Пожалуйста, дайте мне знать, если это то, что вы хотели.

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