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 的所有订单进行排序。
换句话说,select 有 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
根据需要选择最后加入的订单状态。如果你不确定你可以像这样检查真实的查询(在 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)
我有以下型号(为清楚起见缩写):
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 的所有订单进行排序。
换句话说,select 有 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
根据需要选择最后加入的订单状态。如果你不确定你可以像这样检查真实的查询(在 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)