“附件”类中的本地字段“created_at”与基类“Timestampable”

时间:2017-04-25 13:53:31

标签: django database-migration

我有以下两种模式:

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'

我读了hereherehere,当基类是抽象的时,这应该可行。但是,我把它标记为抽象它仍然似乎不起作用。还有什么可能是错的?我正在使用Django 1.8.14。

2 个答案:

答案 0 :(得分:2)

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

请使用:

class Attachment(Timestampable):

而不是:

class Attachment(Timestampable, models.Model):

答案 1 :(得分:0)

我发现了什么问题。我曾经让班级Timestampable不从models.Model继承。因此,在我最初的一次迁移中,我有了这一行:

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

我一直想找到一种方法来删除它。原来我只需要从初始迁移文件中删除这一行。