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

Я не уверен на 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-я миграция, чтобы все это могло работать за один проход без аварийного выхода?

Спасибо за любую помощь/совет.

РЕДАКТИРОВАТЬ: В ответ на комментарий Джона ниже я узнал, что будет работать следующая последовательность командной строки:

  1. ./manage.py syncdb (это инициализирует таблицы Django по умолчанию)
  2. ./manage.py migrate myapp 0001 (при этом создается таблица CompanyAccount)
  3. ./manage.py migrate myapp (это мигрирует до конца без ошибок)

К сожалению, пропуск шага № 2 выше означает, что вы получите то же исключение в миграции 0009, которое говорит мне, что мое первоначальное подозрение было верным, что разрешения по умолчанию для новых моделей не создаются South немедленно, а каким-то образом помещаются в базу данных только тогда, когда завершается вся цепочка миграции.

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


person glenc    schedule 16.05.2011    source источник


Ответы (2)


Как оказалось, ответ заключается в ручном вызове db.send_pending_create_signals() в какой-то момент, прежде чем вы попытаетесь получить доступ к разрешению по умолчанию, поскольку South выполняет этот шаг «сброса» только довольно поздно в процессе. Спасибо Эндрю Годвину из Юга за ответ на этот вопрос в списке рассылки Юга:

http://groups.google.com/group/south-users/browse_thread/thread/1de2219fe4f35959

person glenc    schedule 17.05.2011
comment
И как это сделать в миграции Django? - person Torsten Bronger; 16.03.2015
comment
Я сделал это только в конце метода переадресации, где создаются таблицы. - person erny; 05.11.2018

Вам не нужно запускать «syncdb» по умолчанию в исходной базе данных, чтобы создать таблицу миграции South; прежде чем вы сможете использовать юг. Вы делаете это? Обычно в это время создается таблица разрешений, поскольку у вас есть django.contrib.auth в INSTALLED_APPS.

http://south.aeracode.org/docs/installation.html#configuring-your-django-installation

person John Mee    schedule 16.05.2011
comment
Спасибо за ответ Джон. Это не работает на 100%, но на основе этого я, по крайней мере, выяснил последовательность командной строки, которая без исключения создаст пустую базу данных ... см. Мое редактирование выше. - person glenc; 17.05.2011