You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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语句捕获异常

以上操作均无效果,且未抛出任何错误。

更新

尝试多种代码修改无效后,将焦点转向模型:

  1. 删除并重建SQL表,问题依旧;
  2. 发现未更新的3个字段均带有默认值,其中2个默认值为空字符串;
  3. 将packageManager的默认值改为'Not Acquired',执行迁移后,生产环境中3个字段均正常更新(代码已恢复至原始版本)。

疑问

为何模型默认值的微小修改会引发如此大的差异,且仅影响生产环境而非开发环境?


内容的提问来源于stack exchange,提问作者Shannon Anderson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:44:54