Я не уверен на 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), были бы созданы к моменту завершения 1-й миграции, но не похоже, что они есть. Если я - запустить миграцию после исключения, она работает второй раз, потому что, очевидно, разрешение теперь существует, и 9-я миграция может выполняться без ошибок.
Можно ли что-нибудь сделать, чтобы "очистить" все перед тем, как будет запущена 9-я миграция, чтобы все могло работать за один проход, не выполняя спасения?
Спасибо за любую помощь / совет.
РЕДАКТИРОВАТЬ: В ответ на комментарий Джона ниже, я обнаружил, что следующая последовательность командной строки будет работать:
./manage.py syncdb
(это инициализирует таблицы Django по умолчанию)
./manage.py migrate myapp 0001
(это приводит к созданию таблицы CompanyAccount)
./manage.py migrate myapp
(переносится до конца без ошибок)
К сожалению, пропуск шага 2 выше означает, что вы получаете то же исключение при миграции 0009, которое говорит мне, что мое первоначальное подозрение было верным, что разрешения по умолчанию на новых моделях не создаются Югом сразу, а каким-то образом только выталкиваются в база данных после завершения всей цепочки миграции.
Это лучше, чем там, где я был (сейчас я, по крайней мере, избегаю исключений), но мне все еще нужно вручную сегментировать миграцию вокруг создания новых моделей, которые могут понадобиться последним миграциям для разрешения, поэтому это не так. завершено решение.