加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

django – 覆盖models.Model中每个类的save方法

发布时间:2020-12-20 11:52:28 所属栏目:Python 来源:网络整理
导读:我需要获取每个类,继承models.Model以创建和更新字段.我可以通过向每个字段添加自定义保存方法来实现此目的, def save(self,*args,**kwargs): if not self.id: self.created = timezone.now() self.modified = timezone.now() return super(`models.Model`,s
我需要获取每个类,继承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)

但这违反了NeverRepeatYourself规则.

我试图覆盖models.Model:

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

    def save(self,**kwargs):
        if not self.id:
            self.created = timezone.now()
        self.updated = timezone.now()
        return super(LogModel,**kwargs)

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

编辑

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

解决方法

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

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,**kwargs)

但是,如果重写save()方法,则意味着它不能以任何形式编辑.如果这是你想要的,那么你最好使用auto_now和auto_now_add:

class LogModel(models.Model):

    class Meta:
        abstract = True

    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读