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

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

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

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 17 мая 2011

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

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

1 голос
/ 17 мая 2011

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

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

...