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

