将原始SQL where子句添加到Django queryset

wljmcqd8  于 2023-04-13  发布在  Go
关注(0)|答案(2)|浏览(109)

是否可以在django查询集中添加一个额外的raw sql子句?最好是在普通查询集中添加RawSQL子句。它应该是普通查询集而不是rawqueryset,因为我想在django管理中使用它。
在我的特殊情况下,我想添加一个额外的exists where子句:

and exists (
   select 1
   from ...
)

在我的具体案例中,我有两个模型CustomerSubscriptionSubscription有一个start和可选的end日期字段。
我想拥有一个查询集,其中包含今天有当前订阅的所有客户。像这样的SQL查询:

select *
from customers_customer c
where exists (
  select 1
  from subscriptions_subscription sc
  where sc.customer_id = c.id
  and sc.start < current_date
  and (sc.end is null or sc.end > current_date)
)

我没能用这个做一个查询集。我得到的最好的东西,是这样的:

cs = Customer.objects.annotate(num_subscriptions=RawSQL(
        '''
        select count(sc.id)
        from subscriptions_customersubscription sc
        where sc.customer_id = customers_customer.id
        and sc.start < current_date
        and (sc.end is null or sc.end > current_date)
        ''', []
    ))

但是这个查询的性能不如使用where exists的SQL查询。

jv4diomz

jv4diomz1#

没有回答您的问题,但您可以这样询问客户:

from django.db.models import Q

Customer.objects.filter(
    Q(subscription__start__lt=current_date),
    Q(subscription__end=None) | Q (subscription__end__gt=current_date)
).distinct()
3wabscal

3wabscal2#

对于最初的问题,可以使用QuerySet.extra()方法添加原始SQL,如文档中所述

相关问题