Django auto_now=True 不更新

当Django模型的update_time字段设置为auto_now=True时,通过filter().update()方法更新数据会导致update_time不变,因为此方法直接执行SQL,绕过了Model层。解决方法是先通过filter找到对象,再用get方法获取Model实例,然后通过实例的属性赋值并调用save()更新,这样update_time会自动更新。
create_time = models.DateTimeField(db_column="CreateTime", auto_now_add=True)
update_time = models.DateTimeField(db_column="UpdateTime", auto_now=True)

现象:

update_time 的auto_now设置为True,更新了表格里的某个属性的值,却发现update_time和create_time始终一致,保持最开始的创建时间。

原因:

因为更新时用的filter的update。

filter的update 通常用于批量更新数据,直接调用sql语句,不通过model层,所以导致了update_time不更新。


models.AbilityScore.objects.filter(employee_id=employee_id, 
                                            ability_id=ability_id).update(upcoming_value=upcoming_value)

解决:

先通过filter判断出有该项记录后通过get获取该项记录也即model类的一个实例对象,通过该实例的属性赋值方式来更新,即可使update_time更新,最好记得调用save()。

        if models.AbilityScore.objects.filter(employee_id=employee_id, ability_id=ability_id):
            # models.AbilityScore.objects.filter(employee_id=employee_id,
            #                                    ability_id=ability_id).update(upcoming_value=upcoming_value)
            employee_ability = models.AbilityScore.objects.get(employee_id=employee_id, ability_id=ability_id)
            employee_ability.upcoming_value = upcoming_value
            employee_ability.save()

参考:django model的update时auto_now不被更新的原因 - 代码先锋网

from django.contrib.auth.models import AbstractUser, Group from django.db import models class CustomUser(AbstractUser): ROLE_CHOICES = ( ('user', '普通用户'), ('admin', '管理员'), ('superadmin', '超级管理员'), ) role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='user') phone = models.CharField(max_length=15, blank=True, null=True) created_at = models.DateTimeField(auto_now_add=True) def save(self, *args, **kwargs): super().save(*args, **kwargs) # 自动分配组 if self.role == 'admin': group, _ = Group.objects.get_or_create(name='Admin') self.groups.add(group) elif self.role == 'superadmin': group, _ = Group.objects.get_or_create(name='SuperAdmin') self.groups.clear() self.groups.add(group) class Feedback(models.Model): user = models.ForeignKey(CustomUser, on_delete=models.CASCADE) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) handled = models.BooleanField(default=False) class SearchHistory(models.Model): user = models.ForeignKey(CustomUser, on_delete=models.CASCADE) keyword = models.CharField(max_length=100) timestamp = models.DateTimeField(auto_now_add=True) platform = models.CharField(max_length=10) # 'web' or 'android' class HotEvent(models.Model): title = models.CharField(max_length=200) description = models.TextField() 热度 = models.IntegerField(default=0) url = models.URLField() crawled_at = models.DateTimeField(auto_now_add=True) class SentimentAnalysisResult(models.Model): keyword = models.CharField(max_length=100) positive_count = models.IntegerField(default=0) negative_count = models.IntegerField(default=0) neutral_count = models.IntegerField(default=0) analyzed_at = models.DateTimeField(auto_now_add=True) result_data = models.JSONField() # 存储详细分析结果
最新发布
12-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值