0

我在 Ubuntu 13.04 上使用 Django 1.4 和 Python 2.7。

我知道在 Django 中使用order_by()和跨关系存在问题。distinct()似乎大多数解决此问题的建议解决方案是使用聚合。在我的情况下,我没有看到如何做到这一点。

我有一个QuerySet已经过预过滤的。我需要按 2 个字段对其进行排序,然后通过不同的外键获取结果。

class Contract(models.Model):
    rpl = models.DecimalField(max_digits=20, decimal_places=2, default=0)
    priority = models.IntegerField(default=0)

class Offer(models.Model):
    contract = models.ForeignKey(Contract)
    product = models.ForeignKey(Product)

我需要先按合同优先级然后按合同 rpl 获取报价列表。在这个结果中,我需要提供不同产品的报价。

qs.order_by('-contract__priority', '-contract__rpl').distinct('product')

我如何用 Django 优雅地做到这一点?

4

1 回答 1

1

似乎你需要的是一个 GROUP BY 语句,不幸的是 django 没有提供这个 - 看到这个问题Django: Group by?

就我个人而言,我可能会从不同的角度来处理它,并改用 Product 查询集。您可以通过带注释的优先级/rpl 值过滤报价字段和订单,然后对于每个产品,您需要分别检索报价详细信息。这意味着对每一行进行额外的查询,但这可能是您能做的最好的事情。例如:

Product.objects.filter(offer__...=...) \
               .annotate(priority=models.Max('offer__contract__priority'),
                         rpl=models.Max('offer__contract__rpl')) \ 
               .order_by('-priority', '-rpl')
于 2013-10-17T09:08:41.020 回答