2013-08-17 4 views
0

У меня есть абстрактная модель ProductAttribute, которая может быть связана с моделью продукта. Доступ к атрибутам можно получить с помощью product.attribute_values.Как фильтровать набор запросов Django, перейдя в список параметров?

Скажем, у меня есть форма, содержащая два поля выбора, которые позволяют пользователю указывать значения двух атрибутов - Размер и Вес.

Как я могу в одном запросе передать эти значения в фильтр, так что - как вы можете со списком целых чисел с Object.objects.filter(pk__in=(1,2,3)) - я могу выбрать Продукт, который соответствует всем этим значениям атрибутов?

Я хотел бы быть в состоянии сделать что-то вроде:

options = ['XL','50lbs'] 
p = Product.objects.filter(attribute_values__matches=options) 

Возможно ли это в однострочника в Django?

ТИА

+1

Не могли бы вы показать фактические модели? – alecxe

+0

Я использую каркас корзины Oscar, который абстрагирует атрибуты и параметры продукта. Вот документы, но я не думаю, что реальные модели в этом случае помогут: https://github.com/tangentlabs/django-oscar/blob/master/oscar/apps/catalogue/abstract_models.py –

+0

Что Я действительно получаю общий способ передать фильтр И для данного атрибута в набор запросов. –

ответ

1

Вы можете использовать __contains или __exact

и для случая нечувствительные матчи __icontains и __iexact

Вы можете использовать Q модели Lookups сделат и фильтрации:

options = ['X1', 'X2', 'X3'] 
qs = [Q(attribute_name=option) for option in options] #or attribute_name__icontains - or whatever 

query = qs.pop() #get the first element 

for q in qs: 
    query |= q 

qs = MyModel.objects.filter(query) 
+0

Я думаю, что я просто нашел это тоже, что должно помочь: просто соедините список с запросом на вызов http://stackoverflow.com/questions/769843/how-do-i-use-and-in-a-django-filter –

+0

Спасибо за расширение с примером. :) –

+0

Хм. К сожалению, в этом случае это не совсем работает, поскольку ProductAttribute является отношением внешнего ключа к Продукту. Другими словами, хотя я могу сделать product.attribute_values ​​как ярлык для получения атрибутов продукта, когда я запускаю запрос select выше, я получаю «не могу разрешить атрибут_значений» в поле. Я полагаю, потому что я Нужно ли использовать какой-то select_related call на нем? Любая идея, как я мог бы эффективно перебирать продукты и их атрибуты в одном вызове запроса, например, вы начали выше? –

0

Я в конечном итоге взломал это с небольшой помощью от @karthikr выше, и методы Q.add():

options = {'Size':'XL'} 
qs = Q() 
for key, val in options.iteritems(): 
qs.add(Q(attributes__name=key) & Q(attribute_values__value_option__option=val), qs.connector) 

Надежда это помогает кому-то еще в каком-то небольшом пути в будущем.

Смежные вопросы