我正在为某个模型编写一个简单的搜索表单。让我们调用模型Orchard
,并赋予它属性apples
、oranges
和pears
,只是为了演示。
因此,表单不要求填写所有字段。所以你可以搜索apples
和oranges
,但不能搜索梨。我他们需要这样过滤:
Orchard.objects.filter(apples=request.GET.get('apples'), oranges=request.GET.get('oranges'), pears=request.GET.get('pears'))
但是如果pears
是空的,就永远不会返回结果。
我的第一个想法是使用Q
对象,如下所示:
from django.db.models import Q
options = {}
options['apples'] = request.GET.get('apples')
options['oranges'] = request.GET.get('oranges')
options['pears'] = request.GET.get('pears')
queries = None
for key in options:
if options[key] != u'':
if queries:
queries &= Q(key=options[key]) # <=== problem here
else:
queries = Q(key=options[key]) # <=== same problem here
results = Orchard.objects.filter(queries)
问题出在那些标记的行上。显然,我不能仅仅使用“key”作为属性关键字,因为它不需要字符串,而实际上需要一个变量。
所以。。。我该怎么解决这个问题?
除非这个问题有一个已知的解决方案不涉及Q
。那也会有帮助的。
@second的答案是正确的,使用
**
运算符解压缩字典以提供关键字参数。但是,如果您只使用和来组合
Q
对象,而不使用或,那么您实际上不需要在示例中使用Q
对象。只需构建一个查找字典,然后将其用作filter
的关键字参数。这是使用变量作为关键字arg中的键的一般问题。解决方案是用一个dict包东西并将其解包:
或者对你来说
相关问题 更多 >
编程相关推荐