Django ORM - 通过多个相关对象和 Q 查询选择
Posted
技术标签:
【中文标题】Django ORM - 通过多个相关对象和 Q 查询选择【英文标题】:Django ORM - select by multiple related objects and Q queries 【发布时间】:2013-05-19 12:09:15 【问题描述】:好的,我们有三个表:Order、Product 和 OrderProduct。我想查找Orders有哪些产品,我写了如下函数:
def get_orders_with_products(products):
if len(products) < 1:
raise Exception("at least one product expected")
query = get_order_set_query(products[0])
if len(procducts > 1):
for product in products[1:]:
query = query & get_order_set_query(product)
return Order.objects.filter(query)
def get_order_set_query(product):
product_orders = OrderProduct.objects \
.values_list('order_id', flat=True)\
.filter(product=product)
return Q(id__in=set(product_orders))
此代码将产生如下所示的 sql 查询:
select * from Orders
where id in [1, 2, 3]
and id in [2, 3, 4]
有什么办法可以让Django的ORM写出如下查询?
select * from Orders
where id in (select order_id from OrderProduct where product_id = 1)
and id in (select order_id from OrderProduct where product_id = 2)
有更好的建议吗?
【问题讨论】:
【参考方案1】:是的。
from django.db.models import Q
queryset = Order.objects.filter(Q(order_id = [1, 2, 3]) & Q(order_id = [2, 3, 4]))
你可以用类似的东西替换列表
[id[0] for id in OrderProduct.objects.filter(product_id = 1).values_list('id')]
艾伦
【讨论】:
以上是关于Django ORM - 通过多个相关对象和 Q 查询选择的主要内容,如果未能解决你的问题,请参考以下文章
Django-orm:单表查询基于对象和双下划线的多表操作集合查询分组查询F查询和Q查询