【问题标题】:Django ORM - select by multiple related objects and Q queriesDjango ORM - 通过多个相关对象和 Q 查询选择
【发布时间】: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)

有更好的建议吗?

【问题讨论】:

    标签: django django-orm django-q


    【解决方案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')]
    

    艾伦

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 2010-11-13
      • 2014-05-27
      • 1970-01-01
      • 2015-03-07
      • 2011-10-09
      • 2018-11-18
      相关资源
      最近更新 更多