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

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()

我想按订单接收时间对包含这三种订单状态的所有订单进行排序。
换言之,选择具有已订购、在途和已收订单记录的订单,如下所示:
Order.objects.filter(orderstatus__status=OrderStatus.ORDERED)
             .filter(orderstatus__status=OrderStatus.IN_TRANSIT)
             .filter(orderstatus__status=OrderStatus.RECEIVED)

... 然后根据相关模型的time字段对它们进行排序。
这就是我被困的地方。我已经阅读了关于OrderStatusqueryset修饰符和直接SQL注入的Django文档,但是我仍然不知所措。我能用一个带注释的字段和status=OrderStatus.RECEIVED对象来实现它吗?还是我最好走.extra()路线?

最佳答案

你不是想这样做吗?

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)

10-07 14:36