class 'Attachment' 中的本地字段 'created_at' 与基 class 'Timestampable' 中具有相似名称的字段冲突

Local field 'created_at' in class 'Attachment' clashes with field of similar name from base class 'Timestampable'

我有以下两个模型:

class Timestampable(models.Model):
    created_at = models.DateTimeField(null=True, default=None)
    updated_at = models.DateTimeField(null=True, default=None)

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        now = timezone.now()
        if not self.created_at:
            self.created_at = now
        self.updated_at = now

        super(Timestampable, self).save(*args, **kwargs)

class Attachment(Timestampable, models.Model):
    uuid = models.CharField(max_length=64, unique=True)
    customer = models.CharField(max_length=64)
    user = models.CharField(max_length=64)
    file = models.FileField(upload_to=upload_to)
    filename = models.CharField(max_length=255)
    mime = models.CharField(max_length=255)
    publicly_accessible = models.BooleanField(default=False)

当我尝试迁移这些模型时,出现以下错误:

django.core.exceptions.FieldError: Local field 'created_at' in class 'Attachment' clashes with field of similar name from base class 'Timestampable'

我读到 here, , and here 当基础 class 是抽象的时候这应该有效。但是,我将其标记为抽象它似乎仍然不起作用。还有什么可能是错的?我正在使用 Django 1.8.14.

因为您的 Timestampable 模型已经从 models.Model 扩展而来。您不需要扩展附件模型。

请使用:

class Attachment(Timestampable):

而不是:

class Attachment(Timestampable, models.Model):

我找到问题所在了。我以前 class Timestampable 不是从 models.Model 继承的。因此,在我最初的一次迁移中,我有一行:

bases=(at_common.behaviours.Timestampable, models.Model),

我正在寻找一种方法来删除它。结果我只需要从初始迁移文件中删除这一行。