Итак, по сути, у меня определены две модели: одна - Product, а другая - Timestamp, а модель продукта является иерархической и использует MPTT. > библиотека для реализации древовидной структуры.
Каждый продукт может иметь несколько дочерних элементов с 4 уровнями глубины максимум и иметь несколько временных меток, описывающих данные о том, как они работали в определенную дату. Таким образом, я по сути аннотирую все данные временных рядов для каждого продукта в наборе запросов, и это работает безупречно. Проблема, с которой я столкнулся, заключается в том, что мне нужно упорядочивать продукты динамически по их аннотированным значениям, не разрушая их позиции в >иерархия и/или отношения родитель-потомок. Когда я использую базовый метод типа order_by("tree_id", "level" ...), отношения родитель-потомок «перезаписываются». Также Важно то, что каждый корень продукта имеет свой собственный Tree_id и представляет собой отдельное дерево.
models.py
Код: Выделить всё
class Product(MPTTModel):
owner = models.ForeignKey(Profile, on_delete=models.CASCADE, null=True)
budget = models.FloatField(null=True)
creation_date = models.CharField(max_length=35, null=True)
product_type = models.CharField(max_length=35, null=True)
last_updated = models.DateTimeField(null=True)
name = models.CharField(max_length=35, null=True)
parent = parent = TreeForeignKey('self', on_delete=models.CASCADE,
null=True, blank=True)
class Timestamp(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True)
viewed = models.IntegerField(default=0)
bought = models.IntegerField(default=0)
shown = models.IntegerField(default=0)
date = models.DateField(null=True)

Моя текущая функция упорядочивания набора запросов работает неправильно, ее можно увидеть здесь
Код: Выделить всё
filters = self.request.GET
d_start, d_end = filters["date_start"], filters["date_end"]
qs=Product._tree_manager.get_queryset_descendants(Product.objects.filter(
Exists(Timestamp.objects.filter(
date__gte=d_start,
date__lte=d_end,
product=OuterRef("pk"))
), level=0), include_self=True).annotate(
viewed=(Sum("timestamp__viewed")),
bought=(Sum("timestamp__bought")),
shown=(Sum("timestamp__shown"))).order_by("tree_id", "level", "bought")

Я подозреваю, что для решения потребуется некоторый Необработанный SQL, возможно, Разделение в сочетании с упорядочиванием.
Жду ваших ответов и заранее спасибо.
Подробнее здесь: https://stackoverflow.com/questions/661 ... tree-table