My favorites | Sign in
Project Home Downloads Wiki Issues Source
READ-ONLY: This project has been archived. For more information see this post.
Search
for
  Advanced search   Search tips   Subscriptions

Issue 65 attachment: select-related.diff (5.6 KB)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
Index: mptt/utils.py
===================================================================
--- mptt/utils.py (révision 121)
+++ mptt/utils.py (copie de travail)
@@ -100,7 +100,7 @@
yield current, copy.deepcopy(structure)

def drilldown_tree_for_node(node, rel_cls=None, rel_field=None, count_attr=None,
- cumulative=False):
+ cumulative=False, select_related=False):
"""
Creates a drilldown tree for the given node. A drilldown tree
consists of a node's ancestors, itself and its immediate children,
@@ -128,7 +128,9 @@
"""
if rel_cls and rel_field and count_attr:
children = node._tree_manager.add_related_count(
- node.get_children(), rel_cls, rel_field, count_attr, cumulative)
+ node.get_children(select_related=select_related), rel_cls,
+ rel_field, count_attr, cumulative)
else:
- children = node.get_children()
- return itertools.chain(node.get_ancestors(), [node], children)
+ children = node.get_children(select_related=select_related)
+ ancestors = node.get_ancestors(select_related=select_related)
+ return itertools.chain(ancestors, [node], children)
Index: mptt/models.py
===================================================================
--- mptt/models.py (révision 121)
+++ mptt/models.py (copie de travail)
@@ -3,7 +3,7 @@
Preorder Tree Traversal.
"""

-def get_ancestors(self, ascending=False):
+def get_ancestors(self, ascending=False, select_related=False):
"""
Creates a ``QuerySet`` containing the ancestors of this model
instance.
@@ -17,13 +17,17 @@
return self._tree_manager.none()

opts = self._meta
- return self._default_manager.filter(**{
+ if select_related:
+ manager = self._default_manager.select_related(opts.parent_attr)
+ else:
+ manager = self._default_manager
+ return manager.filter(**{
'%s__lt' % opts.left_attr: getattr(self, opts.left_attr),
'%s__gt' % opts.right_attr: getattr(self, opts.right_attr),
opts.tree_id_attr: getattr(self, opts.tree_id_attr),
}).order_by('%s%s' % ({True: '-', False: ''}[ascending], opts.left_attr))

-def get_children(self):
+def get_children(self, select_related=False):
"""
Creates a ``QuerySet`` containing the immediate children of this
model instance, in tree order.
@@ -36,11 +40,16 @@
if self.is_leaf_node():
return self._tree_manager.none()

- return self._tree_manager.filter(**{
+ opts = self._meta
+ if select_related:
+ manager = self._tree_manager.select_related(opts.parent_attr)
+ else:
+ manager = self._tree_manager
+ return manager.filter(**{
self._meta.parent_attr: self,
})

-def get_descendants(self, include_self=False):
+def get_descendants(self, include_self=False, select_related=False):
"""
Creates a ``QuerySet`` containing descendants of this model
instance, in tree order.
@@ -59,7 +68,11 @@
else:
filters['%s__gt' % opts.left_attr] = getattr(self, opts.left_attr)
filters['%s__lt' % opts.left_attr] = getattr(self, opts.right_attr)
- return self._tree_manager.filter(**filters)
+ if select_related:
+ manager = self._tree_manager.select_related(opts.parent_attr)
+ else:
+ manager = self._tree_manager
+ return manager.filter(**filters)

def get_descendant_count(self):
"""
@@ -68,7 +81,7 @@
return (getattr(self, self._meta.right_attr) -
getattr(self, self._meta.left_attr) - 1) / 2

-def get_next_sibling(self):
+def get_next_sibling(self, select_related=False):
"""
Returns this model instance's next sibling in the tree, or
``None`` if it doesn't have a next sibling.
@@ -85,14 +98,18 @@
'%s__gt' % opts.left_attr: getattr(self, opts.right_attr),
}

+ if select_related:
+ manager = self._tree_manager.select_related(opts.parent_attr)
+ else:
+ manager = self._tree_manager
sibling = None
try:
- sibling = self._tree_manager.filter(**filters)[0]
+ sibling = manager.filter(**filters)[0]
except IndexError:
pass
return sibling

-def get_previous_sibling(self):
+def get_previous_sibling(self, select_related=False):
"""
Returns this model instance's previous sibling in the tree, or
``None`` if it doesn't have a previous sibling.
@@ -111,9 +128,13 @@
}
order_by = '-%s' % opts.right_attr

+ if select_related:
+ manager = self._tree_manager.select_related(opts.parent_attr)
+ else:
+ manager = self._tree_manager
sibling = None
try:
- sibling = self._tree_manager.filter(**filters).order_by(order_by)[0]
+ sibling = manager.filter(**filters).order_by(order_by)[0]
except IndexError:
pass
return sibling
@@ -131,7 +152,7 @@
'%s__isnull' % opts.parent_attr: True,
})

-def get_siblings(self, include_self=False):
+def get_siblings(self, include_self=False, select_related=False):
"""
Creates a ``QuerySet`` containing siblings of this model
instance. Root nodes are considered to be siblings of other root
@@ -145,7 +166,12 @@
filters = {'%s__isnull' % opts.parent_attr: True}
else:
filters = {opts.parent_attr: getattr(self, '%s_id' % opts.parent_attr)}
- queryset = self._tree_manager.filter(**filters)
+
+ if select_related:
+ manager = self._tree_manager.select_related(opts.parent_attr)
+ else:
+ manager = self._tree_manager
+ queryset = manager.filter(**filters)
if not include_self:
queryset = queryset.exclude(pk=self.pk)
return queryset
Powered by Google Project Hosting