django 数据 增加一个p_save方法 model含有更新时间的字段,原有save方法会自动更新,p_save方法不变更含有更新时间的字段而是保持原有值,只将其他实例修改字段变更怎么实现
时间: 2024-10-18 13:08:20 浏览: 15
Django model重写save方法及update踩坑详解
在Django中,如果你想要为模型添加一个`p_save`方法,它不改变包含自动更新时间字段(如`created_at`或`updated_at`)的值,但允许你手动处理其他自定义修改的字段,你可以这样做:
首先,确保你的模型类中有一个自动更新的时间戳字段,例如:
```python
from django.db import models
from django.utils import timezone
class MyModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True) # 自动更新字段
custom_field = models.CharField(max_length=100)
def __str__(self):
return self.custom_field
```
然后,你可以创建一个名为`p_save`的预保存方法,比如:
```python
class MyModel(models.Model):
# ...
def p_save(self, *args, **kwargs):
if not self.pk: # 如果是新创建的对象
self.created_at = timezone.now()
# 手动处理你想保留不变的字段,例如custom_field
custom_value_to_keep = self.custom_field
# 执行原始的save方法,但传递额外的参数
super(MyModel, self).save(*args, update_fields=['custom_field'], **kwargs)
# 更新自定义字段的值,如果需要的话(这里假设custom_value_to_keep未改变)
self.custom_field = custom_value_to_keep
# 重写原save方法,调用自定义方法
save = p_save
```
在这个例子中,当你通过`p_save`方法保存对象时,`created_at`字段会在对象创建时设置,而`updated_at`字段会在调用`super().save`时自动更新。只有`custom_field`会被明确地更新,其他字段则不会。
阅读全文