2009-07-22 48 views
4

我期待创建一个稍微复杂一点的查询,使用原始SQL可以很容易地编写。这里的原始查询的例子:Django的ORM查询使用过滤器()和Q对象的组合

选择我,领域销售WHERE is_paid =虚假或状态= 'toship' AND otherfield = '富' 和anotherfield = 'BAR'

这很简单,它会生成所有is_paid = False的结果,然后为我的AND匹配生成第二个结果集。

现在我知道关于Q对象,我知道过滤,但我似乎无法包装我的头脑围绕如何在Django ORM干净地实现这一点。

任何提示?

感谢

回答

19

您可以继续建立您的问与答对象几分时尚动感。

例子:

query1 = Q(is_paid=False) 

query2 = Q() 

if status: 
    query2 = Q(status=status) 

if otherfield: 
    query2 = query2 & Q(otherfield=otherfield) 

if anotherfield: 
    query2 = query2 & Q(anotherfield=anotherfield) 

query = query1 | query2 

result = model.objects.filter(query) 
2

像这样的东西应该工作:

model.objects.filter(Q(is_paid=False) | Q(status='toship', otherfield='FOO', anotherfield='BAR')) 

编辑: 不能创建动态地被执行,你可以构建一个包含SQL语句的字符串以相同的方式查询完成后。如果你想这样做,我会建议使用的,如果状态,功能或什么最适合你的使用情况:

if query == 'simple': 
    result = model.objects.filter(Q(is_paid=False)) 
else: 
    result = model.objects.filter(Q(is_paid=False) | Q(status='toship', otherfield='FOO', anotherfield='BAR')) 
for items in result: 
    ... 

这可能是比较复杂的,但我敢肯定你的想法。

+1

好吧,我现在猜我的问题。假设我有一个基本上是这样的查询: model.objects.filter(Q(is_paid = False)) 我想用一些动态值将另一个Q对象添加到该查询中,以产生基本相同的查询你发布了,但它会动态创建。这就是我在这种情况下挣扎的地方。 我将如何实现这一目标? – Bartek 2009-07-22 15:53:32

+0

不要忘记从django.db.models导入Q – 2017-06-13 14:43:17

13

尽管googletorp是正确的,你不能动态地使用字符串构造查询,但你可以使用来完成字典参数。喜欢的东西:

model.objects.filter(Q(**mydict1) | Q(**mydict2)) 

其中mydict1和2的形式为:

{'field1': 'value1'} 
{'field2__icontains': 'value2'} 

+0

是的,它很好做。 – kn3l 2009-12-30 08:21:01

1

这是做动态 “或” 查询一个伟大的方式:

import operator 
from django.db.models import Q 
from your_app.models import your_model_object 

q_list = [Q(question__startswith='Who'), Q(question__startswith='What')] 
your_model_object.objects.filter(reduce(operator.or_, q_list)) 
如果你想用 “AND”

your_model_object.objects.filter(reduce(operator.and_, q_list))