【发布时间】:2021-02-13 23:23:00
【问题描述】:
我正在使用 Django 和 PostgreSQL 作为我的后端堆栈,该应用程序的主要功能是一个复杂的多级表,显示不同产品的带注释的时间序列数据。
所以基本上我定义了 2 个模型,一个是 Product,另一个是 Timestamp,而 Product Model 是分层的并使用 MPTT 用于实现树形结构的库。 每个产品可以有多个子级,最大 4 级深度,并有多个时间戳,描述它们在特定日期的表现数据。因此,我基本上是在为查询集中的每个产品注释所有时间序列数据,并且可以完美运行。我面临的问题是我需要通过注释值动态订购产品,而不破坏它们在中的位置>层次结构和/或父子关系。当我使用一些基本的 order_by("tree_id", "level" ...) 方法时,父子关系会被“覆盖”。另外重要是每个 Product-root 都有自己的 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")
我怀疑该解决方案将需要一些 Raw SQL,可能需要将 Partitioning 与排序结合使用。
期待您的回答,并在此先感谢您。
【问题讨论】:
标签: python sql django database postgresql