Django按相关模型字段排序查询集

时间:2015-06-15 19:04:47

标签: mysql sql django django-models django-queryset

我有以下型号(为清晰起见缩写):

class Order(models.Model):
    some fields

class OrderStatus(models.Model):
    order = models.ForiegnKey(Order)
    status = models.CharField(choices=['ORDERED', 'IN_TRANSIT', 'RECEIVED'])
    time = models.DateTimeField()

我想按订单收到的时间对包含所有三个OrderStatuses的所有订单进行排序。

换句话说,选择具有Ordered,In Transit和Received记录的订单,如下所示:

Order.objects.filter(orderstatus__status=OrderStatus.ORDERED)
             .filter(orderstatus__status=OrderStatus.IN_TRANSIT)
             .filter(orderstatus__status=OrderStatus.RECEIVED)

...然后按time相关OrderStatus模型的status=OrderStatus.RECEIVED字段对其进行排序。

这就是我被困住的地方。我已经在.extra() queryset修饰符和直接SQL注入上阅读了Django文档,但我仍然处于亏损状态。我可以使用带注释的字段和Q对象来实现它,还是我最好走.extra路径?

1 个答案:

答案 0 :(得分:1)

你没试过这样做吗?

Order.objects.filter(orderstatus__status=OrderStatus.ORDERED)
             .filter(orderstatus__status=OrderStatus.IN_TRANSIT)
             .filter(orderstatus__status=OrderStatus.RECEIVED)
             .order_by('orderstatus__time')

在我的模型上,它按预期工作 - order_by根据需要选择最后加入的orderstatus。如果你不确定你可以检查这样的真实查询(在django shell中):

from django.db import connection
# perform query
print(connection.queries)

也可以这样做:

OrderStatus.objects.filter(status=OrderStatus.RECEIVED)
                   .order_by('time').select_related('order')
                   .filter(order__orderstatus__status=OrderStatus.ORDERED)
                   .filter(order__orderstatus__status=OrderStatus.IN_TRANSIT)