You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
django-mptt has a feature get_queryset_descendants which query the descendants of tree nodes represented by a queryset. However, TreeQuerySet.descendants method in django-tree-queries only support query descendants of a certain tree node. After doing some experiments, I find a way to implement such feature, like bellow:
defdescendants(self, of, include_self=False):
...
extra_where=" or ".join(['instr(__tree.tree_path, "{sep}{pk}{sep}") <> 0'.format(
pk=self.model._meta.pk.get_db_prep_value(pk(obj), connection),
sep=SEPARATOR,
) forobjinof])
queryset=self.with_tree_fields().extra(
# NOTE! The representation of tree_path is NOT part of the API.where=[
# XXX This *may* be unsafe with some primary key field types.# It is certainly safe with integers.extra_where
]
)
The idea is if of parameter is a queryset rather than a single model instance, changing the where clause to or.
The downside of this approach is we need an extra database query. I also have no idea if there is performance issue for a large queryset.
Another idea I come up with is inject a a subquery in CTE, like bellow:
change:
SELECT0AS tree_depth,
array[T.{pk}] AS tree_path,
array[{order_by}] AS tree_ordering,
T."{pk}"FROM {db_table} T
WHERE T."{parent}" IS NULL
to:
SELECT0AS tree_depth,
array[T.{pk}] AS tree_path,
array[{order_by}] AS tree_ordering,
T."{pk}"FROM {db_table} T
WHERE T."{parent}"in<<pks of queryset>>
but I also have no idea that this is feasible.
The text was updated successfully, but these errors were encountered:
jukanntenn
changed the title
Support get queryset descendants or ancestors
Is it feasible to support get queryset descendants or ancestors like features in django-mptt
Jan 9, 2022
This would certainly be doable; the problem is that django-tree-queries doesn't add much API at all. It has almost no extension points. What you write would probably be more straightforward to implement on top of a more generic solution for building CTEs, maybe https://pypi.org/project/django-cte/
django-mptt
has a featureget_queryset_descendants
which query the descendants of tree nodes represented by a queryset. However,TreeQuerySet.descendants
method in django-tree-queries only support query descendants of a certain tree node. After doing some experiments, I find a way to implement such feature, like bellow:The idea is if
of
parameter is a queryset rather than a single model instance, changing the where clause to or.The downside of this approach is we need an extra database query. I also have no idea if there is performance issue for a large queryset.
Another idea I come up with is inject a a subquery in CTE, like bellow:
change:
to:
but I also have no idea that this is feasible.
The text was updated successfully, but these errors were encountered: