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.
我有 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.