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

重写Django的save与update方法后,update陷入无限循环问题求助

Django双库同步update方法无限循环的解决办法

问题原因

你重写的PrimitiveQuerySet.update方法中,调用super().using('New').update()时,using()返回的依然是自定义的PrimitiveQuerySet实例,而非原生Django的QuerySet。这会导致第二次调用update时,再次触发你重写的逻辑,形成无限递归循环。

解决方法

方法一:添加递归标记避免重复触发

在update方法中增加一个私有参数作为递归标记,当标记为True时直接调用父类方法,跳过自定义逻辑:

class PrimitiveQuerySet(QuerySet):
    def update(self, *args, _internal_call=False, **kwargs):
        # 如果是内部递归调用,直接执行原生update
        if _internal_call:
            return super().update(*args, **kwargs)
        
        # 先更新默认数据库
        update_count = super().update(*args, **kwargs)
        # 调用新库的update时传入_internal_call=True,避免循环
        self.using('New').update(*args, _internal_call=True, **kwargs)
        
        return update_count

方法二:直接调用原生QuerySet的update方法

通过绕过自定义QuerySet的update,直接调用父类的父类方法来更新第二个库:

class PrimitiveQuerySet(QuerySet):
    def update(self, *args, **kwargs):
        # 更新默认库
        update_count = super().update(*args, **kwargs)
        # 获取原生QuerySet实例并调用update
        raw_queryset = super(QuerySet, self.using('New'))
        raw_queryset.update(*args, **kwargs)
        
        return update_count

额外提示

你的save方法代码中,save_base的调用缺少闭合括号,虽然你说功能正常,但建议补全避免潜在问题:

self.save_base(using='New', force_insert=False, force_update=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 19:38:31