基于Django ORM的反向查找

时间:2015-05-20 13:49:22

标签: python django postgresql

我在Django中有两个模型(伪)。我正在使用Django 1.7和Postgres 9.4。

使用以下字段模拟BuySaleTransactionBreakDown:

product = models.ForeignKey(Product)
closing_balance = models.BigIntegerField(default=0, null=True)
date_created = models.BigIntegerField(editable=False, default=0)
last_updated = models.BigIntegerField(editable=False, default=0)

使用以下字段模拟BuySaleTransaction:

infrastructure_unit = models.ForeignKey(InfrastructureUnit)
breakdown = models.ManyToManyField(BuySaleTransactionBreakDown)
date_created = models.BigIntegerField(editable=False, default=0)
last_updated = models.BigIntegerField(editable=False, default=0)

我希望针对特定 infrastructure_unit 的所有产品获取所有最新 BuySaleTransactionBreakDown条目

我写了以下代码

  

BuySaleTransactionBreakDown.objects.annotate(Max(' last_updated'))。filter(buysaletransaction__infrastructure_unit = self)

但是我没有得到理想的结果,group by子句没有按预期工作。

您能否帮我解决正确的问题。感谢。

3 个答案:

答案 0 :(得分:0)

更改annotatefilter

的顺序

http://jsfiddle.net/btw8ceyy/1/说:

  

当annotate()子句应用于查询时,将根据查询状态计算注释,直到请求注释的位置。这样做的实际意义是filter()和annotate()不是可交换操作 - 也就是说,查询之间存在差异:

答案 1 :(得分:0)

根据django documentation

BuySaleTransactionBreakDown.objects.filter(buysaletransaction__infrastructure_unit = self).values('product').annotate(latest_entry=Max('last_updated'))order_by('-latest_entry') #assuming self is an infrastructure_unit object

答案 2 :(得分:0)

似乎Postgres希望select语句中的所有参数都出现在Group By子句中。

所以我通过使用以下代码解决了这个问题:

BuySaleTransactionBreakDown.objects.filter(buysaletransaction__infrastructure_unit = self).order_by('product__id','-last_updated').distinct('product__id')