【问题标题】:CircularDependencyError by inherting FK from Abstract ClassCircularDependencyError 通过从抽象类继承 FK
【发布时间】:2018-01-06 21:24:50
【问题描述】:

我有以下抽象类:

class UserStamp(models.Model):
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True,
                                   related_name='%(app_label)s_%(class)s_created_by', on_delete=models.CASCADE)
    updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True,
                                   related_name='%(app_label)s_%(class)s_updated_by', on_delete=models.CASCADE)

    class Meta:
        abstract = True

账户模型继承自它:

class Account(UserStamp):
 pass

我有一个带有 FK 的用户模型

class User(AbstractBaseUser,PermissionsMixin, UserStamp):
    account = models.ForeignKey(Account, blank=True, null=True, related_name='owner',on_delete=models.CASCADE)

迁移时出现以下错误:

django.db.migrations.exceptions.CircularDependencyError:

我认为出现循环错误是因为:

Account 通过从 UserStamp 继承 created_by、updated_by 来调用 User,so 指向 User,而 User 用 Account FK 指向 Account。

如果我使用:

  account = models.ForeignKey('accounts.Account', blank=True, null=True, related_name='owner',on_delete=models.CASCADE) 

问题没有解决。

我的问题有(2个问题),但我决定将最初的问题分成2个问题更清楚(我认为它们可以单独解决):

Second part here(如何设置created_by、updated_by)

【问题讨论】:

  • 你可以把引用的调制解调器写成字符串:'app.model'。
  • @danihip 我检查了示例,但在我的情况下,我有 settings.AUTH_USER_MODEL (自定义用户)不是用作字符串的直接模型,如果我尝试将它用作一个字符串“字段定义了与模型'settings.AUTH_USER_MODEL'的关系,它要么未安装,要么是抽象的。”
  • @danihp 可以详细说明,根据我的情况举个例子(使用'accounts.Account'我仍然得到循环错误)
  • 抱歉,我没有意识到错误是在迁移中,但在模型中它本身。将 None 作为默认值并使用 post save 信号设置值呢?

标签: django django-models django-users


【解决方案1】:

您可以通过修改模型的save() 方法来设置默认用户:

class UserStamp(models.Model):
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True,
    ...
    def save(self, *args, **kwargs):
        if not self.created_by:
           super_users = settings.AUTH_USER_MODEL.objects.filter(
                is_superuser=True).order_by('date_joined')
           first_user = super_users[0]
           self.created_by = first_user
        super().save(*args, **kwargs)

但我认为这不是导致您的迁移错误的原因。你可能想试试OneToOneField

【讨论】:

  • 我更新了我的问题以更清楚;请检查第二部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
相关资源
最近更新 更多