我有两个模型:Order
和OrderStatus
。
不要担心Order,但OrderStatus有以下字段:
order = models.ForiegnKey(Order)
status = models.CharField (choice that can be either ORDERED, IN_TRANSIT, or RECEIVED)
OrderStatuses是在订单更改状态时创建的,因此最初只有ORDERED
状态,然后是ORDERED
和IN_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对象的用途。
答案 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
个对象(如果状态为ORDERED
,RECEIVED
OR
IN_TRANSIT
,您还可以执行某些操作像这样的东西
Order.objects.filter(orderstatus__status__in=[OrderStatus.ORDERED, OrderStatus.IN_TRANSIT, OrderStatus.RECEIVED])