我假设这是因为我的超级用户依赖于UserProfile,而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应该不适用于超级用户吗?我该如何防止这种情况?
答案 0 :(得分:27)
2011年3月23日凌晨4点25分,Malcolm Box写道:
进一步调查:看起来它是南/ syncdb交互。该 UserProfile将由南迁移创建,但当然也是如此 当auth post_install运行以提示超级用户时,它没有运行。
可悲的是syncdb --migrate也没做正确的事。
目前,我只是使用./manage.py手动创建超级用户 shell,但欢迎任何关于如何更好地解决这个问题的想法。
在syncdb期间不要创建超级用户,您的用户配置文件表将不存在。 您必须在admin上创建一个创建用户配置文件的创建信号 喜欢失败
您要用来初始化数据库的过程是:
python manage.py syncdb --noinput
python manage.py migrate
python manage.py createsuperuser
参考:https://groups.google.com/forum/?fromgroups=#!topic/django-users/sBXllxrIdMc
答案 1 :(得分:0)
我刚刚遇到了同样的问题 - 通过迁移创建的配置文件模型,以及使用初始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)
当然,这也将在进行未来迁移时运行,为没有迁移的用户创建配置文件。对我来说,这不是问题。