Django中如何仅更新指定属性而不修改模型全部字段触发额外逻辑
解决方案
有两种常用实现方式可以满足你的需求:
方案1:调整save逻辑+指定更新字段
这种方式适合你后续仍需要执行save方法内除counter自增外的其他逻辑的场景:
- 首先修改
save方法的counter自增逻辑,仅在首次创建保单时触发:
def save(self, *args, **kwargs): # 仅新增保单(无主键ID)时才递增counter if not self.pk: self.counter = counter + 1 super().save(*args, **kwargs)
- 更新status时调用
save方法,通过update_fields指定仅更新status字段:
@property def policy_escape(self): # 注意原代码此处逻辑有误,today是方法需调用,且判断条件要匹配「日期为当日」的需求 if self.date == datetime.date.today(): self.status = 2 self.save(update_fields=['status'])
方案2:直接调用QuerySet的update方法
这种方式完全不触发实例的save方法,不会执行其中的任何附加逻辑,仅更新指定的status字段:
@property def policy_escape(self): if self.date == datetime.date.today(): # 直接操作数据库更新字段,不走save逻辑 Policy.objects.filter(pk=self.pk).update(status=2) # 同步更新当前实例的status属性,避免后续使用时取到旧值 self.status = 2
原有代码注意点
你现有的policy_escape属性判断逻辑存在问题:
datetime.date.today是方法对象,需要加括号datetime.date.today()才会返回当日日期对象- 原判断逻辑
if self.date - datetime.date.today是判断两个日期的差不为0,也就是「日期不是当日」时才会修改状态,和你的需求相反
内容的提问来源于stack exchange,提问作者maca
相关产品推荐
相关产品推荐

