Django - 如何在多个反向查找匹配上过滤查询集

时间:2014-12-10 21:24:55

标签: django django-queryset django-filter

我有两个模型:OrderOrderStatus

不要担心Order,但OrderStatus有以下字段:

order = models.ForiegnKey(Order)
status = models.CharField (choice that can be either ORDERED, IN_TRANSIT, or RECEIVED)  

OrderStatuses是在订单更改状态时创建的,因此最初只有ORDERED状态,然后是ORDEREDIN_TRANSIT状态,之后是ORDERED,{ {1}}和IN_TRANSIT状态都作为一个订单的foriegn键存在。这是为了跟踪时间等。

我想查找具有所有三种状态的所有订单。换句话说,所有已收到并且有效的订单,因为它们具有其他两种状态。

这是一个空集:

RECIEVED

...但这很好用:

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

这有什么区别?有什么方法可以简化吗?我认为这就是Q对象的用途。

1 个答案:

答案 0 :(得分:1)

这意味着需要所有字段的查询

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

这意味着第三个过滤器正在应用第二个过滤器的结果而第二个过滤器正在应用第一个过滤器的结果

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

如果您想要获取Order个对象(如果状态为ORDEREDRECEIVED OR IN_TRANSIT,您还可以执行某些操作像这样的东西

Order.objects.filter(orderstatus__status__in=[OrderStatus.ORDERED, OrderStatus.IN_TRANSIT, OrderStatus.RECEIVED])