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
相关产品推荐
相关产品推荐

