覆盖模型中每个类的保存方法

Bot*_*ndr 3 django django-models

我需要获取继承了models.Model的每个类,以创建和更新字段。我可以通过向每个字段添加自定义保存方法来实现此目的,

def save(self, *args, **kwargs):
    if not self.id:
        self.created = timezone.now()
    self.modified = timezone.now()
    return super(`models.Model`, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

但这违反了Don'tRepeatYourself规则。

我试图覆盖models.Model:

class LogModel(models.Model):
    created = models.DateTimeField(editable=False)
    updated = models.DateTimeField()

    def save(self, *args, **kwargs):
        if not self.id:
            self.created = timezone.now()
        self.updated = timezone.now()
        return super(LogModel, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

并使用LogModel而不是models.Model,但这失败,并显示错误E006(字段'x'与模型'y.logmodel'中的字段'x'冲突。

编辑

我的主要问题是如何向我的models.py中的所有模型添加自定义特定字段

Ant*_*ard 5

您的基本模型必须是抽象的:

class LogModel(models.Model):

    class Meta:
        abstract = True

    created = models.DateTimeField(editable=False)
    updated = models.DateTimeField()

    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
        # Use self._state.adding to check if this is a new instance,
        # ID not being empty is not a guarantee that the instance
        # exists in the database
        # and if `update_fields` is passed, you must add the fields to the
        # list or they won't be saved in the database.
        if force_insert or self._state.adding:
            self.created = timezone.now()
            if update_fields and 'created' not in update_fields:
                update_fields.append('created')
        self.updated = timezone.now()
        if update_fields and 'updated' not in update_fields:
            update_fields.append('updated')
        return super(LogModel, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

但是,如果重写该save()方法,则意味着它将无法以任何形式进行编辑。如果这是您想要的,那么最好使用auto_nowauto_now_add

class LogModel(models.Model):

    class Meta:
        abstract = True

    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
Run Code Online (Sandbox Code Playgroud)