Django save()仅更新部分字段:生产环境异常原因咨询
Django生产环境save()仅更新部分字段,修改模型默认值后恢复正常
我们的API接收远程cURL请求的JSON数据并保存到PostgreSQL数据库,已将有效值赋值给模型对象,但调用object.save()时,本该更新4个字段,实际却只有1-2个写入数据库。这个问题仅在生产服务器出现,开发环境使用runserver运行完全正常。
代码中已在赋值后打印对象属性,确认数据准确且符合模型要求。
模型代码
class LUMAgentConfig(models.Model): class Meta: unique_together = ('team', 'clientID', 'computerID'), team = models.ForeignKey(Team, related_name='team_lum_agent_config', on_delete=models.CASCADE) clientID = models.CharField(max_length=80) computerID = models.CharField(max_length=80) isEnabled = models.BooleanField(default=False) rebootRequired = models.BooleanField(default=False) lastScanDate = models.DateTimeField(blank=True, null=True) lastUpdate = models.DateTimeField(blank=True, null=True) packageManager = models.CharField(max_length=10, blank=True, default='') packageManagerVersion = models.CharField(max_length=40, blank=True, default='') updateCount = models.IntegerField(default=0) def __str__(self): return str(self.team.id) + " -> Agent -> " + str(self.computerID)
视图简化代码
if validateJSON(myJson): data = json.loads(myJson) computerID = data['computerID'] clientID = data['clientID'] scriptVersion = data['scriptVersion'] packageManager = data['packageManager'] packageManagerVersion = data['packageManagerVersion'] print("computerID -> " + str(computerID)) lumConfig = LUMAgentConfig.objects.get(team_id=team.id, clientID=clientID, computerID=computerID) print(lumConfig.clientID) lumConfig.packageManager = str(packageManager) print(lumConfig.packageManager) lumConfig.packageManagerVersion = str(packageManagerVersion) print(lumConfig.packageManagerVersion) lumConfig.updateCount = int(len(data['packages'])) print(lumConfig.updateCount) lumConfig.lastScanDate = timezone.now() print(lumConfig.lastScanDate) print("PM:[" + str(lumConfig.packageManager) + "] Ver:[" + str(lumConfig.packageManagerVersion) + "] Pgs:[" + str(lumConfig.updateCount) + "]" ) lumConfig.save()
我们使用PostgreSQL和Django 4.2。
生产环境打印日志
computerID -> 05b1d029-3fc4-aee2-9337-22523ef0052d U3F1aWRXb3Jrcw== apt 2.4.8 43 2023-05-02 16:50:08.965043+00:00 PM:[apt] Ver:[2.4.8] Pgs:[43]
问题现象
数据库中仅lumConfig.lastScanDate字段更新;手动修改数据库数据后,代码不会将其覆盖为空。
已尝试的解决方案
- 指定字段保存(如
lumConfig.save(update_fields=['packageManager', ...])) - 逐字段赋值后立即调用
save() - 添加try语句捕获异常
以上操作均无效果,且未抛出任何错误。
更新
尝试多种代码修改无效后,将焦点转向模型:
- 删除并重建SQL表,问题依旧;
- 发现未更新的3个字段均带有默认值,其中2个默认值为空字符串;
- 将
packageManager的默认值改为'Not Acquired',执行迁移后,生产环境中3个字段均正常更新(代码已恢复至原始版本)。
疑问
为何模型默认值的微小修改会引发如此大的差异,且仅影响生产环境而非开发环境?
内容的提问来源于stack exchange,提问作者Shannon Anderson
相关产品推荐
相关产品推荐

