Я не уверен на 100%, что делаю это правильно, но я думаю, что обнаружил проблему, из-за которой объекты auth.Permission
не создаются достаточно быстро, чтобы миграция могла использовать их при инициализации БД с нуля.
Важные детали:
Я пытаюсь инициализировать Django DB с нуля, используя
./manage.py syncdb --migrate --noinput
У меня 11 миграций в моей цепочке
Первая миграция создает новую модель с именем
myapp.CompanyAccount
.9-я миграция пытается получить разрешение
myapp.change_companyaccount
с помощью:
p = orm[ "auth.Permission" ].objects.get( codename = "change_companyaccount" )
В этот момент возникает исключение:
django.contrib.auth.models.DoesNotExist: Permission matching query does not exist
Я предполагал, что разрешения по умолчанию, определенные для каждого объекта (согласно http://docs.djangoproject.com/en/dev/topics/auth/#default-permissions) были бы созданы к моменту завершения первой миграции, но, похоже, это не так. Если я повторно запускаю миграцию после исключения, она работает во второй раз, потому что, по-видимому, разрешение теперь существует, и 9-я миграция может выполняться без ошибок.
Можно ли что-нибудь сделать, чтобы «сбросить» все до того, как запустится 9-я миграция, чтобы все это могло работать за один проход без аварийного выхода?
Спасибо за любую помощь/совет.
РЕДАКТИРОВАТЬ: В ответ на комментарий Джона ниже я узнал, что будет работать следующая последовательность командной строки:
./manage.py syncdb
(это инициализирует таблицы Django по умолчанию)./manage.py migrate myapp 0001
(при этом создается таблица CompanyAccount)./manage.py migrate myapp
(это мигрирует до конца без ошибок)
К сожалению, пропуск шага № 2 выше означает, что вы получите то же исключение в миграции 0009, которое говорит мне, что мое первоначальное подозрение было верным, что разрешения по умолчанию для новых моделей не создаются South немедленно, а каким-то образом помещаются в базу данных только тогда, когда завершается вся цепочка миграции.
Это лучше, чем то, что было у меня (теперь я по крайней мере избегаю исключений), но мне все еще нужно вручную сегментировать миграцию вокруг создания новых моделей, разрешения которых могут потребоваться последним миграциям, так что это не < em>полное решение.