django 数据.save方法 model含有更新时间的字段,save方法会自动更新,不想它变更而是保持原有值怎么实现
时间: 2024-10-18 07:04:37 浏览: 17
Django model重写save方法及update踩坑详解
如果你在Django模型中有一个表示更新时间的字段(例如`created_at` 或 `modified_at`),并且希望在调用`.save()`时不自动更新这个字段,你可以通过覆盖默认的`pre_save`信号处理器来实现。`pre_save`是一个钩子,允许你在模型实例保存之前执行一些定制的操作。
首先,在你的模型文件中添加一个`pre_save`方法:
```python
from django.db.models.signals import pre_save
from django.dispatch import receiver
class YourModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True) # 不想自动更新的字段
modified_at = models.DateTimeField(auto_now=True) # 同理,除非特别指定
@receiver(pre_save, sender=YourModel)
def prevent_update_of_created_modified_fields(sender, instance, *args, **kwargs):
if not instance.pk: # 初始创建时,不需要阻止
return
# 更新操作
if instance.created_at != instance._original_created_at: # 避免在初次保存时改变
instance.created_at = instance._original_created_at
if instance.modified_at != instance._original_modified_at:
instance.modified_at = instance._original_modified_at
```
在这个例子中,我们检查实例是否已经存在(通过`instance.pk`),如果是新记录,则不采取任何动作。对于已存在的实例,我们将`created_at` 和 `modified_at` 设置回它们在保存之前的原始值(存储在`_original_created_at` 和 `_original_modified_at`这样的内部属性中)。
这样,当你调用`.save()`时,只有在其他字段发生变化时,这些时间戳才会被更新。如果你只关心某个特定字段的更改而不影响`created_at`和`modified_at`,你需要明确地处理那个字段。
阅读全文