使用保存后信号调用函数的递归错误

时间:2018-01-15 12:41:25

标签: django python-3.x recursion django-signals

我有一个Category模型,其中ForeignKey是自我。

class Category(SEO, MetaData):
    parent = models.ForeignKey('self', blank=True, null=True, verbose_name='parent category', on_delete=models.CASCADE)
    path = ArrayField(models.IntegerField(), blank=True, null=True)

我介绍了路径字段,以避免在窗口小部件中递归,并进行建模,因为通常不会这样做。

我使用post_save信号来保存路径:

def _recurse_for_parent(cat_obj, path=None):
    # path at the beginning don't exist and need to be initialized
    if not path:
        path = []
    if cat_obj.parent is not None:
        _recurse_for_parent(cat_obj.parent, path)
    return path


def save_path(sender, instance, **kwargs):
    if instance.parent_id:
        instance.children = _recurse_for_parent(instance.parent)
        instance.save()



post_save.connect(save_path, sender=Category)

我的问题是我得到了#34;最大递归深度误差"我不明白为什么,因为我使用的条件是:

cat_obj.parent is not None:

2 个答案:

答案 0 :(得分:1)

我在def save_path中发现错误,我致电instance.save(),这将触发post_save信号。

由于post_save信号调用save_pathsave path调用save触发post_save,我进入无限循环。

我通过将我的逻辑移到save方法来解决。

答案 1 :(得分:0)

您在函数中有多个问题

def _recurse_for_parent(cat_obj, path=None):
    # path at the beginning don't exist and need to be initialized
    if not path:
        path = []
    if cat_obj.parent is not None:
        _recurse_for_parent(cat_obj.parent, path)
    return path

首先请记住not []将返回True,因此如果将路径设置为[],则每次都会执行相同的操作。请改用is None

其次,从不使用递归调用的值。

最后想想当两个条件都为真时会追加什么。