0

我有一个与用户 (django.contrib.auth.models.User) 模型具有 OneToOne 关系的自定义模型;

class Profile(models.Model):
    user = models.OneToOneField(User)

我想在每次创建用户时创建一个新的配置文件。所以我添加了一个信号;

@receiver(post_save, sender=User)
def _setup_user(sender, **kwargs):
    """
    Create a new profile instance for each user
    """
    created = kwargs.get('created', False)
    user = kwargs.get('instance', False)
    if created and user:
        profile = Profile(user=kwargs['instance'])
        profile.save()

这一切都很好,但是 syncdb 在创建管理员用户时会引发错误,因为尚未创建 Profile 表(我正在使用 South 来管理迁移)。

我怎样才能解决这个问题?

编辑

因此,省略创建超级用户是可行的;

$ ./manage.py syncdb --noinput
$ ./manage.py migrate
$ ./manage.py createsuperuser
4

2 回答 2

1

你可以尝试这样的事情:

from django.db import DatabaseError, transaction

@receiver(post_save, sender=User)
@transaction.commit_manually
def _setup_user(sender, **kwargs):
    """
    Create a new profile instance for each user
    """
    created = kwargs.get('created', False)
    user = kwargs.get('instance', False)
    if created and user:
        try:
            profile = Profile(user=kwargs['instance'])
            profile.save()
        except DatabaseError:
            transaction.rollback()
        else:
            transaction.commit()

根据您的数据库后端,您可能不需要手动事务管理,但对于 psycopg2 是必要的,否则您会收到“当前事务已中止”错误。

如果您采用这种方法,那么您需要在运行 syncdb 后手动为超级用户创建配置文件,因此在这种特定情况下,我认为TheSpurg 的答案更简单。尽管如此,仍然值得知道如何从 DataBaseError 中恢复,所以无论如何我都会发布这个答案。

于 2014-03-24T18:37:20.503 回答
1

首先运行 syncdb 并拒绝创建超级用户。然后在创建数据库运行后manage.py createsuperuser

这是1.6 的文档

如果您有任何麻烦,请告诉我,但如果唯一的问题是没有首先创建数据库,那么这应该可以。

希望能帮助到你

干杯

于 2014-03-24T18:25:36.883 回答