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

Django运行时临时修改on_delete实现模型数据同步方案问询

背景

我正在开发一款Jurnal应用,目前正在实现多设备间的数据同步功能。我希望按模型逐一同步数据,而非同步整个数据库,甚至支持仅同步部分条目。

当前我面临的问题是用新的同步数据替换某一模型的现有数据,我已获取该模型的新数据JSON文件。其他模型通过ForeignKey关联到该模型,且设置了on_delete=CASCADE。我已生成新旧主键映射字典{old_pk : new_pk...},用于更新关联模型的ForeignKey值(同步的模型主键会变更)。

核心问题

我希望删除旧数据时不触发级联删除,因此想要在运行时临时将on_delete设置为DO_NOTHING,直到完成数据迁移。
注:ReadAt模型代码如下:

read_by = models.ForeignKey(
    Person,
    on_delete=models.CASCADE, # 需在运行时临时改为DO_NOTHING
)

我期望通过运行时修改实现如下逻辑:

# 删除旧数据
ReadAt.on_delete=DO_NOTHING # 期望实现的伪代码

Person.objects.all().delete()  # 若无上述修改,此操作会删除所有ReadAt数据

# 加载新数据
with open("person_file.json", mode="w+", encoding="utf-8") as myfile:
    myfile.write(json.dumps(data_new_server))
call_command("loaddata", "person_file.json")

# 利用已生成的映射更新ReadAt的主键关联

ReadAt.on_delete=CASCADE # 伪代码,改回原设置
# 理想状态下此时检查ReadAt数据的完整性
替代方案瓶颈

我曾考虑如下方案,但遇到瓶颈:

  • 获取待导入数据的最大主键MAX_PK。
  • 修改Person模型的所有主键(及ReadAt中的关联外键),为其加上MAX_PK。
    • 我不知道如何实现此操作,主键似乎不可编辑,尝试相关方案无效。
  • 导入新数据(新旧数据主键无重叠)。
  • 将ReadAt中的关联主键从旧值更新为新值。
  • 删除所有主键>=MAX_PK的Person数据,此步骤后无关联外键指向这些数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:09:55