Django: форсировать порядок создания таблицы на syncdb - PullRequest
2 голосов
/ 24 мая 2011

У меня есть модель профиля, которая используется для определения профиля для пользователя из приложения авторизации.Кроме того, у меня есть сигнал, который будет создавать пустой профиль каждый раз, когда создается пользователь.

Проблема в том, что при запуске из чистой таблицы профиля создается после таблицы пользователя, поэтому, когда япопросил добавить суперпользователя, моя функция сигнала терпит неудачу, потому что нет таблицы профиля для ввода пустого профиля.

Есть ли способ заставить в каком порядке таблицы должны быть созданы syncdb, чтобытаблица профилей уже должна быть создана при добавлении суперпользователя?

Ответы [ 2 ]

4 голосов
/ 24 мая 2011

Выполните одно из следующих действий:

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

  2. Не вставляйте никакие данные до инициализации всей схемы БД. Вам не нужно создавать суперпользователя во время syncdb, это можно сделать позже из консоли dev (django-admin.py shell) или вы можете поместить пользователя и профиль суперпользователя в устройство initial_data.json вашего приложения, которое автоматически загружается во время syncdb. Это сбросит информацию о любом syncdb, но в некоторых случаях это приемлемо.

  3. Используйте AutoOneToOneField из django-annoying lib для автоматического создания профиля при первом обращении к нему. Вот как я бы решил эту проблему сам - не нужно переделывать существующую функциональность с сигналами. Вот пример из их вики:

    from annoying.fields import AutoOneToOneField
    
    class MyProfile(models.Model):
        user = AutoOneToOneField(User, primary_key=True)
    
1 голос
/ 24 мая 2011

Порядок создания таблиц зависит от того, в каком порядке они находятся в вашем INSTALLED_APPS

Попробуйте переместить ваше приложение с профилем выше django.contrib.auth

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

...