Не удается создать суперпользователя Django

Я предполагаю, что это связано с тем, что мой суперпользователь зависит от UserProfile, у которого пока нет данных. Моя модель выглядит как

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save

class UserProfile(models.Model):
    user = models.OneToOneField(User) # required
    location = models.CharField(max_length=100)
    age = models.PositiveIntegerField(blank=True,null=True)
    contribution_points = models.PositiveIntegerField()
    #acheivements = models.ManyToMany()

def create_user_profile(sender,instance,created,**kwargs):
    if created:
        UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)

Однако, я получаю следующую ошибку:

django.db.utils.DatabaseError: (1146, "Table 'savory_db.login_userprofile' doesn't exist")

несмотря на то, что он просто запустил syncdb

Имеет ли моя модель какие-либо противоречивые поля, которые могли бы вызвать эту ошибку. Должен ли UserProfile применяться к суперпользователю? Как мне это предотвратить?

Ответ 1

23 марта 2011 года, в 4:25, Malcolm Box написал:

Дальнейшее исследование: похоже, что это взаимодействие South/syncdb. UserProfile будет создан южной миграцией, но, конечно, это не запускается, когда auth post_install запускается для запроса суперпользователя.

К сожалению, syncdb -migrate тоже не подходит.

В настоящее время я просто создаю суперпользователя вручную, используя. /manage.py shell, но приветствовал бы любые идеи о том, как решить эту проблему лучше.

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

Процедура, которую вы хотите использовать для инициализации базы данных:

python manage.py syncdb --noinput
python manage.py migrate
python manage.py createsuperuser

Ссылка: https://groups.google.com/forum/?fromgroups=#!topic/django-users/sBXllxrIdMc

Ответ 2

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

Мое решение таково.

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

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    try:
        WheelProfile.objects.get_or_create(user=instance)
    except DatabaseError:
        logging.error("Failed to create profile for %s, perhaps migrations haven't run yet?" % instance)
        from django.db import connection
        connection._rollback()

Во-вторых, запустите обработчик при завершении миграции:

from south.signals import post_migrate

@receiver(post_migrate)
def create_profiles(app, **kwargs):
    if app == "wheelcms_axle":
        for u in User.objects.all():
            WheelProfile.objects.get_or_create(user=u)

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