【发布时间】:2021-08-28 00:16:14
【问题描述】:
如何在第一个 LEFT OUTER JOIN 上添加 OR 条件?像这样:
LEFT OUTER JOIN "orders_orderedproductsku" ON ("manual_shipments"."id" = "orders_orderedproductsku"."shipment_id" OR "manual_shipments"."id" = "orders_orderedproductsku"."return_shipment_id")
已经尝试过其他解决方法,但仍然没有希望。有没有可能我可以正确添加 OR 条件?
这是我的查询集:
shipment_rebooking = queryset \
.filter(status='BOOKING_CANCELED') \
.annotate(orderedproductsku__shipment_id=F('orderedproductsku__shipment_id'),
logistics_shipment__shipment_id=F('logisticsshipments__shipment_id'),
orderedproductsku__status=F('orderedproductsku__status'),
logistics_shipment__status=F('logisticsshipments__status'),
logistics_shipment__id=F('logisticsshipments__id')) \
.filter(Q(logistics_shipment__status='BOOKING_CANCELED') | Q(logistics_shipment__id__isnull=True),
orderedproductsku__status__in=['PREPARING_FOR_SHIPMENT', 'SCHEDULED_FOR_RETURN', 'SCHEDULED_FOR_RETURN_NO_REFUND']) \
.order_by('-created_at') \
.distinct()```
the raw query is like this:
```SELECT DISTINCT "manual_shipments"."created_at",
"manual_shipments"."updated_at",
"manual_shipments"."deleted_at",
"manual_shipments"."id",
"manual_shipments"."order_reference_number",
"manual_shipments"."logistics_provider_id",
"manual_shipments"."logistics_provider_shipment_id",
"manual_shipments"."logistics_name",
"manual_shipments"."tracking_number",
"manual_shipments"."tracking_url",
"manual_shipments"."shipping_cost",
"manual_shipments"."status",
"manual_shipments"."shipment_type",
"manual_shipments"."seller_id",
"manual_shipments"."buyer_id",
"manual_shipments"."latest_logistics_shipment_id",
"manual_shipments"."latest_status_id",
"orders_orderedproductsku"."shipment_id" AS "orderedproductsku__shipment_id",
"logistics_shipments"."shipment_id" AS "logistics_shipment__shipment_id",
"orders_orderedproductsku"."status" AS "orderedproductsku__status",
"logistics_shipments"."status" AS "logistics_shipment__status",
"logistics_shipments"."id" AS "logistics_shipment__id"
FROM "manual_shipments"
LEFT OUTER JOIN "orders_orderedproductsku" ON ("manual_shipments"."id" = "orders_orderedproductsku"."shipment_id")
LEFT OUTER JOIN "logistics_shipments" ON ("manual_shipments"."id" = "logistics_shipments"."shipment_id")
WHERE ("manual_shipments"."status" = BOOKING_CANCELED
AND ("logistics_shipments"."status" = BOOKING_CANCELED
OR "logistics_shipments"."id" IS NULL)
AND "orders_orderedproductsku"."status" IN (PREPARING_FOR_SHIPMENT, SCHEDULED_FOR_RETURN, SCHEDULED_FOR_RETURN_NO_REFUND))
ORDER BY "manual_shipments"."created_at" DESC```
【问题讨论】:
-
你能告诉我们“queryset”之前的代码吗?比如,它是由“Model.objects.filter()...”组成的
-
这是在查询集之前: def get_queryset(self, request): queryset = super(ScheduledReturnOrderedProductSkuAdmin, self).get_queryset(request)
标签: python-3.x django postgresql django-admin django-orm