Django order_by()和distinct(<field>)w / annotate </field>

时间:2013-10-16 23:17:09

标签: python django orm

我在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优雅地完成这项工作?

1 个答案:

答案 0 :(得分:1)

看起来你需要的是一个GROUP BY语句,不幸的是django没有提供 - 请参阅这个问题Django: Group by?

就我个人而言,我可能会从不同的角度处理它,而是使用Product queryset。您可以按提供的优先级/ rpl值过滤商品字段和订单,然后针对每个产品,您需要单独检索商品详细信息。它意味着每行的额外查询,但它可能是您可以做的最好的。例如:

Product.objects.filter(offer__...=...) \
               .annotate(priority=models.Max('offer__contract__priority'),
                         rpl=models.Max('offer__contract__rpl')) \ 
               .order_by('-priority', '-rpl')