Django通过外键查询订单(反方向)

Django order query by foreign key (reverse direction)

我有 2 个简单的模型,像这样:

class Obj(models.Model):
    ...

class Objdata(models.Model):
    obj = models.ForeignKey(Obj)
    ...
    datum = models.DateTimeField()

。我的目标是 select 所有基于所属 Objdata 的最新数据条目的 Objs。

也许对于 django 来说它已经太复杂了,但是在 sql 方面查询它并不是那么复杂。

那么,有没有一种 Django 方法可以实现这一点,或者如何最好(?)实现它。目前我的解决方案有点复杂。


一个小的伪代码可能有助于实现我想要实现的目标:

lst = []
for elem in Obj.objects.filter():
    try:
        lst.append((elem.objdata_set.all().order_by('-datum')[0].datum, elem))
    except:
        lst.append((elem.datum, elem))
res = [e[1] for e in sorted(lst, reverse = True)]

如果我理解正确,试试这个:

objdates = Objdate.objects.order_by('obj_id', '-dateum').distinct('obj_id').select_related('obj')
objs = [objdate.obj for objdate in objdates] 

如果我对您的代码的理解正确,您只想获取所有 Objs,并按最新 Objdata.datum 排序。您可以通过聚合来做到这一点:

from django.db.models import Max
objs = Obj.objects.annotate(latest_data=Max('objdata__datum')).order_by('latest_data')

作为替代方案,如果您认为 Django 的模型查询太多或不足以实现您想要的,或者您更愿意 SQL(但是 sql 一边查询它并不那么复杂), 你可以使用 raw READ MORE HERE:

Obj.objects.raw('SELECT ... your SQL statement here;')

这将return一个模型实例,您也可以直接使用连接执行自定义SQLREAD HERE.