我有以下两种模式:
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,here和here,当基类是抽象的时,这应该可行。但是,我把它标记为抽象它仍然似乎不起作用。还有什么可能是错的?我正在使用Django 1.8.14。
答案 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),
我一直想找到一种方法来删除它。原来我只需要从初始迁移文件中删除这一行。