我正在寻找一种有效的方法,用于在批量删除Django对象时更新相关模型上的缓存计算字段-示例:
class Parent:
child_count = IntegerField()
class Child:
parent = ForeignKey(Parent, related_name='children')
这里,child_count
是.annotate(Count('children'))
查找的缓存版本。
基于parent
以外的字段批量删除许多子级时,会出现问题。我当前的选择是:
child_count
的{{1}}和Child
信号中的post_save
。优点:简单且无代码重复,可正常删除和批量删除
缺点::批处理删除非常慢,因为Django必须分别为每个对象调用处理程序。
pre_delete
优点:快速
缺点:每个附加FK的样板代码,在删除子级的任何地方都必须小心使用此自定义实现。
我想理想的解决方案应该是“ Queryset-level”信号处理,但是我找不到实现它的好方法。