将raw sql where子句添加到django queryset

时间:2016-05-05 20:20:56

标签: django django-queryset

是否可以在django查询集中添加额外的原始sql子句? 最好使用RawSQL子句指向普通查询集。 它应该是一个普通的查询集,而不是一个rawqueryset,因为我想在django admin中使用它。

在我的特定情况下,我想添加一个额外的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查询。

1 个答案:

答案 0 :(得分:2)

不回答您的问题,但您可以像这样查询客户:

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()