是否可以在django查询集中添加额外的原始sql子句?
最好使用RawSQL
子句指向普通查询集。
它应该是一个普通的查询集,而不是一个rawqueryset,因为我想在django admin中使用它。
在我的特定情况下,我想添加一个额外的exists
where子句:
and exists (
select 1
from ...
)
在我的具体案例中,我有两个模型Customer
和Subscription
。 Subscription
有一个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查询。
答案 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()