【问题标题】:Add OR condition in left join using Django ORM使用 Django ORM 在左连接中添加 OR 条件
【发布时间】: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


【解决方案1】:

首先左连接,右连接离开这些东西。 Django ORM 在那里,您可以使用函数来执行数据库操作。 Django 有多种功能可供使用。

要在 django 过滤器查询中执行 OR,请执行以下操作:-

from django.db.models import Q
users = User.objects.filter(Q(email='sarath@gmail.com') | Q(first_name='john'))

此查询的意思是 - 给电子邮件为“sarath@gmail.com”或名字为“john”的用户。

'|'代表 OR。

使用 Q,您可以组合任意数量的过滤器。

【讨论】:

    猜你喜欢
    • 2020-05-18
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2018-01-16
    • 2018-04-08
    相关资源
    最近更新 更多