1

我有一个可以与 Product 模型关联的抽象 ProductAttribute 模型。可以使用 product.attribute_values 访问属性。

假设我有一个包含两个选择框的表单,允许用户指定两个属性的值 - 大小和重量。

我如何在单个查询中将这些值传递到过滤器中,以便 - 正如您可以使用整数列表一样Object.objects.filter(pk__in=(1,2,3))- 我可以选择与所有这些属性值匹配的产品?

我希望能够做类似的事情:

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

这可能在 Django 的单行中吗?

TIA

4

2 回答 2

3

您可以使用__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)
于 2013-08-17T20:04:28.037 回答
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)

希望这可以在将来以某种小的方式对其他人有所帮助。

于 2013-08-17T21:58:44.503 回答