繁体   English   中英

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

[英]Django sort queryset by related model field

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

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)

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

这就是我被困的地方。 我已经阅读了关于.extra()修饰符和直接 SQL 注入的 Django 文档,但我仍然不知所措。 我可以使用带注释的字段和Q对象来实现它,还是我最好走.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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM