CircularDependencyError 通过从 Abstract 继承 FK Class

CircularDependencyError by inherting FK from Abstract Class

我有以下摘要class:

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通过继承UserStampcreated_by,updated_by调用User,所以指向User,User用Account FK指向Account。

如果我使用:

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

问题没有解决。

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

(如何设置created_by,updated_by)

您可以通过修改模型的 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