【问题标题】:Django post_save hook causing an error for syncdbDjango post_save 钩子导致 syncdb 错误
【发布时间】:2014-03-24 18:15:31
【问题描述】:

我有一个与用户 (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

【问题讨论】:

    标签: python django django-syncdb


    【解决方案1】:

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

    Here's 1.6 的文档

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

    希望对你有帮助

    干杯

    【讨论】:

      【解决方案2】:

      你可以试试这样的:

      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 是必需的,否则您会收到“current transaction is aborted”错误。

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

      【讨论】:

        猜你喜欢
        • 2014-09-07
        • 2020-04-01
        • 2018-07-26
        • 2014-09-21
        • 1970-01-01
        • 1970-01-01
        • 2012-11-17
        • 1970-01-01
        • 2015-06-23
        相关资源
        最近更新 更多