我在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子句没有按预期工作。
您能否帮我解决正确的问题。感谢。
答案 0 :(得分:0)
更改annotate
和filter
。
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')