17

我假设这是因为我的超级用户依赖于尚无现有数据的 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 不应该应用于超级用户吗?我应该如何防止这种情况?

4

2 回答 2

27

2011 年 3 月 23 日凌晨 4:25,Malcolm Box 写道:

进一步调查:看起来这是一个 South/syncdb 交互。UserProfile 将由南迁移创建,但是当 auth post_install 运行以提示超级用户时,它当然没有运行。

可悲的是 syncdb --migrate 也没有做正确的事情。

目前,我只是使用 ./manage.py shell 手动创建一个超级用户,但欢迎任何关于如何更好地解决这个问题的想法。

不要在 syncdb 期间创建超级用户,您的用户配置文件表将不存在。您必须在管理员上有一个创建用户配置文件的创建信号,这看起来像是失败了

用于初始化数据库的过程是:

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

参考:https ://groups.google.com/forum/?fromgroups=#!topic/django-users/sBXllxrIdMc

于 2012-12-27T19:48:58.053 回答
1

我刚刚遇到了同样的问题——通过迁移创建的配置文件模型,以及在使用初始创建超级用户时中断的信号处理程序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)

当然,这也将在进行未来迁移时运行,为没有配置文件的用户创建配置文件。对我来说,这不是问题。

于 2013-11-16T15:59:40.697 回答