一尘不染

如何在Django中“按组查询”?

sql

(这是SQL连接时线程的django版本:选择一对多关系中的最后一个记录

假设我有一个客户表和一个采购表。每次购买都属于一个客户。我想获得所有客户的清单以及他们的上一次购买。是否可以在没有原始SQL且没有多个数据库查询的情况下完成?


阅读 209

收藏
2021-03-10

共1个答案

一尘不染

您可以看一下类似的讨论:

从不同类别获取最新对象的Django查询

据我所知,在Django ORM中没有单步执行此操作的方法。

但是您可以将其分为两个查询:

from django.db.models import Max

bakeries = Bakery.objects.annotate(
    hottest_cake_baked_at=Max('cake__baked_at')
) 
hottest_cakes = Cake.objects.filter(
    baked_at__in=[b.hottest_cake_baked_at for b in bakeries]
)

如果蛋糕的ID与bake_at时间戳一起在进行,则可以简化上面的代码并消除歧义(如果两个蛋糕同时到达,则可以同时获得它们):

from django.db.models import Max

hottest_cake_ids = Bakery.objects.annotate(
    hottest_cake_id=Max('cake__id')
).values_list('hottest_cak‌​e_id', flat=True)

hottest_cakes = Cake.objects.filter(id__in=hottest_cake_ids)
2021-03-10