如何让'auto_now'忽略特定字段的更新

问题描述 投票:0回答:2

我有这个型号:

    name = models.CharField(max_length=255)
    modify_time = models.DateTimeField(auto_now=True)
    chasha = models.CharField(max_length=255)
    stat = models.CharField(max_length=255)

通常,当我更新任何

modify_time
name
chasha
字段时,
stat
也会更新。但我不希望在更新“stat”时更新“modify_time”。我怎样才能做到这一点?

python django model
2个回答
3
投票

使用自定义保存方法通过查看以前的实例来更新字段。

from django.db import models
from django.utils import timezone as tz


class MyModel(models.Model):
    name = models.CharField(max_length=255)
    modify_time = models.DateTimeField(null=True, blank=True)
    chasha = models.CharField(max_length=255)
    stat = models.CharField(max_length=255)

    def save(self, *args, **kwargs):
        if self.pk: # object already exists in db
            old_model = MyModel.objects.get(pk=self.pk)
            for i in ('name', 'chasha'): # check for name or chasha changes
                if getattr(old_model, i, None) != getattr(self, i, None):
                    self.modify_time = tz.now() # assign modify_time
        else: 
             self.modify_time = tz.now() # if new save, write modify_time
        super(MyModel, self).save(*args, **kwargs) # call the inherited save method

编辑:像上面一样从

auto_now
中删除
modify_time
,否则它将在保存方法中设置。


0
投票

从 Django 5.0 开始,模型保存中有一个 update_fields 属性。

例如:obj.save(update_fields=['field1', 'field2', ...])

https://docs.djangoproject.com/en/dev/ref/models/instances/

通过仅指定需要更新的特定字段,可以绕过 auto_now 设置为 true 的字段更新。

© www.soinside.com 2019 - 2024. All rights reserved.