Не удается создать суперпользователя 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)
Это, конечно же, будет выполняться при выполнении будущих миграций, создавая профили для пользователей, у которых их нет. Для меня это не проблема.