2015-07-11 4 views
4

Я добавляю пользовательские разрешения с помощью «мета» в моделях Django. Ниже приведен простой пример.Django meta permissions

Models.py

class Meta: 
    permissions = (
     ("can_do_stuff", "Can do stuff"), 
    ) 

Это прекрасно работает, я добавляю приведенный выше код модели, а затем сделать свои миграции, а затем перенести их. Разрешение создается и доступно для использования.

Однако, когда я удаляю (или изменяю) это разрешение из раздела «meta» моей модели и снова makemigrations, migrate, разрешение (которое было удалено/изменено) не удалено из системы Django.

Это не проблема, если бы я выяснил, что моя система разрешений 100%, но я хорошо настраивал вещи, когда узнаю, и в результате список разрешений становится беспорядочным с разрешениями «устаревшего».

Я разрабатываю и выпускаю новые версии для серийного использования на частой основе, а разрешения становятся беспорядочными в производстве, где я не могу просто стереть БД, как я мог в dev.

Есть ли рекомендуемый способ сделать это?

Я могу удалить устаревшие разрешения вручную непосредственно из базы данных (кажется, это всего лишь одна запись, которую мне нужно удалить, и это, похоже, не вызывает никаких проблем). Это кажется плохим способом сделать это, при условии ошибки, забыли и т. Д.

+0

Вы пробовали сделать некоторые другие модификации модели, чтобы убедиться, что новая миграция создана, и проверил, что разрешение здесь не удаляется ?. EDIT: я нашел [закрытый вопрос] (https://code.djangoproject.com/ticket/23256), похоже, что он исправлен. – guival

ответ

0

Вы пробовали перемещаться назад, а не вперед?

<app_label> <migrationname>: Приносит схему базы данных в состояние, в котором применяется именованная миграция, но не позже миграций в том же приложении не применяются. Это может привести к несанкционированному переносу, если вы ранее мигрировали за именованный перенос. Используйте ноль для отмены всех миграций для приложения.

Я думаю, что команда makemigrations сканирует модели разрешений мета, и произвести «вставить» SQL в Permission таблице для каждого недостающего permssion, он фактически не делать двухстороннюю синхронизацию в миграции сценария.

Но сценарий миграции может возвращать изменения с помощью инструкции «удалить» для каждой «вставки».

Так попробуйте:

python manage.py migrate the_app the_migration_before_the_last 

Если это не работает, либо, отправьте сообщение об ошибке в проекте Django.

Смежные вопросы