我有一个抽象的ProductAttribute模型,可以与Product模型相关联。可以使用product.attribute_values访问属性。
假设我有一个包含两个选择框的表单,允许用户指定两个属性的值 - 大小和重量。
如何在单个查询中将这些值传递到过滤器中,以便 - 就像使用Object.objects.filter(pk__in=(1,2,3))
的整数列表一样 - 我可以选择与所有这些属性值匹配的产品?
我希望能够做到这样的事情:
options = ['XL','50lbs']
p = Product.objects.filter(attribute_values__matches=options)
这是否可以在Django的单行中使用?
TIA
答案 0 :(得分:1)
您可以使用__contains
或__exact
以及不区分大小写的匹配__icontains
和__iexact
您可以使用Q
模型查找来执行和过滤:
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)
答案 1 :(得分: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)
希望将来能以某种小的方式帮助别人。