【发布时间】:2011-09-22 05:11:53
【问题描述】:
有没有人有一个有效的算法来检索一个 mptt 查询集的所有祖先?到目前为止我能想到的最好的是这样的:
def qs_ancestors(queryset):
if isinstance(queryset, EmptyQuerySet):
return queryset
queryset_aggs = queryset.values_list('tree_id', 'level').annotate(max_lft=Max('lft'), min_rght=Min('rght'))
new_queryset = queryset.none()
for tree_id, level, max_lft, min_rght in queryset_aggs:
ancestors = MyModel.objects.filter(
tree_id=tree_id,
level__lt=level,
lft__lte=max_lft,
rght__gte=min_rght,
)
new_queryset = ancestors | new_queryset
return new_queryset
这种方法有两个问题:
- 如果存在不相邻的分支(即它实际上不起作用),则会失败
- 它的效率非常低,因为它最终在最终查询中包含
number_of_trees*number_of_levels子句,它可以很快变得非常大
我愿意在其他地方缓存祖先,但我想不出一种有效的方法。我考虑添加一个以逗号分隔的祖先 id 列表的字段,然后在额外内容中执行 GROUP_CONCAT(我在 MySQL 中),但我认为这可能会变得巨大/缓慢。
【问题讨论】:
标签: python django hierarchical-data django-mptt mptt