2013-05-23 1 views
0

Хорошо, у нас есть три таблицы: заказ, продукт и заказ продукта. Я хочу, чтобы найти то, что заказы есть некоторые продукты, и я написал следующую функцию:Django ORM - выбор по нескольким связанным объектам и Q-запросам

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] 

Есть ли способ сделать Джанго 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) 

Любые предложения, чтобы сделать это лучше?

ответ

0

Да.

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')] 

Алан