the*_*edk 14 python django list mptt descendant
我试图让所有descendants(include_self=True)不是一个节点,而是一个节点列表(一个QuerySet).这应该是一个SQL查询.
示例(实际上不起作用:)
some_nodes = Node.objects.filter( ...some_condition... )
some_nodes.get_descendants(include_self=True) #hopefully I would like
to have all possible Nodes starting from every node of "some_nodes"
Run Code Online (Sandbox Code Playgroud)
我现在唯一的想法是遍历some_nodes并为每个节点运行get_descendants() - 但这是一个非常糟糕的解决方案(大量的SQL查询).
如果没有干净的方法通过Django ORM这样做,你可以提供一个自定义SQL来运行吗?在这里你可以假设我有一个Node的pk列表.
编辑:如果这可以帮助 - 我的所有"some_nodes"都放在同一个父目录中,并在树中具有相同的"级别".
非常感谢Craig de Stigter回答了关于django-mptt-dev小组的问题,万一有人需要它我很乐意从http://groups.google.com/group/django-mptt-dev/browse_thread/thread重新发布他的解决方案/ 637c8b2fe816304d
from django.db.models import Q
import operator
def get_queryset_descendants(nodes, include_self=False):
if not nodes:
return Node.tree.none()
filters = []
for n in nodes:
lft, rght = n.lft, n.rght
if include_self:
lft -=1
rght += 1
filters.append(Q(tree_id=n.tree_id, lft__gt=lft, rght__lt=rght))
q = reduce(operator.or_, filters)
return Node.tree.filter(q)
Run Code Online (Sandbox Code Playgroud)
示例节点树:
T1
---T1.1
---T1.2
T2
T3
---T3.3
------T3.3.3
Run Code Online (Sandbox Code Playgroud)
用法示例:
>> some_nodes = [<Node: T1>, <Node: T2>, <Node: T3>] # QureySet
>> print get_queryset_descendants(some_nodes)
[<Node: T1.1>, <Node: T1.2>, <Node: T3.3>, <Node: T3.3.3>]
>> print get_queryset_descendants(some_nodes, include_self=True)
[<Node: T1>, <Node: T1.1>, <Node: T1.2>, <Node: T2>, <Node: T3>, <Node: T3.3>, <Node: T3.3.3>]
Run Code Online (Sandbox Code Playgroud)
更高版本的mptt已经在对象管理器中内置了此功能.所以解决方法如下:
Node.objects.get_queryset_descendants(my_queryset, include_self=False)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6776 次 |
| 最近记录: |