django-mptt 过滤而不破坏树

Posted

技术标签:

【中文标题】django-mptt 过滤而不破坏树【英文标题】:django-mptt filter without breaking the tree 【发布时间】:2012-09-04 10:35:52 【问题描述】:

我在我的 Django 应用程序中使用 django-mptt 作为 Article 模型。如果我想获取所有设置为隐藏的文章,我可以这样做

Article.objects.filter(hidden=False)

但这会破坏 mptt-tree。如何过滤我的查询集,不仅可以排除所有隐藏的文章,还可以排除这些节点的子节点,从而保持树的完整性,以便我仍然可以使用 tree_info 模板标签?

【问题讨论】:

该查询以什么方式“破坏”树? 那么这样做一个节点可能会失去它的父节点。 :o 【参考方案1】:

我也有类似的问题。我想删除一个节点及其所有子节点。

这是我如何做到的:

class FolderForm(forms.ModelForm):
    class Meta:
        model = Folder
        fields = ('name', 'parent')

    def __init__(self, *args, **kwargs)
        super(FolderForm, self).__init__(*args, **kwargs)

        if self.instance is not None:
            exclude_ids = [f.id for f in self.instance.get_descendants(
                include_self=True)]

            self.fields['parent'].queryset = self.fields['parent'].queryset \
                .exclude(pk__in=exclude_ids)

【讨论】:

【参考方案2】:

有一个更简单的解决方案:只需将所有子项也设置为隐藏即可。

【讨论】:

以上是关于django-mptt 过滤而不破坏树的主要内容,如果未能解决你的问题,请参考以下文章

jQuery UI 自动完成:从对象数组加载:过滤被破坏

为什么Rstudio数据查看器过滤被dplyr分组表破坏?

过滤器是不是会破坏 Flex 4.5 皮肤中的 colorizeExclusions,如果是,是不是有解决方法?

修改/过滤而不改变对象

过滤掉特定值而不排除 NULL 行

如何在 Laravel 中过滤数据而不刷新页面?