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