Django按外键查询(反方向)

时间:2015-01-04 22:39:24

标签: python mysql django

我' 2个简单的模型,如下:

class Obj(models.Model):
    ...

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

。我的目标是根据所属的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)]

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

如果我理解你正确的尝试:

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

答案 2 :(得分:0)

作为替代方案,如果你认为Django的模型查询太多或不足以实现你想要的,或者你更喜欢SQL(但是在sql方面它'查询它并不是那么复杂),你可以使用原始 READ MORE HERE

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

这将返回模型实例,您也可以使用连接 READ HERE直接执行自定义SQL。