我希望创建一个写很容易使用原始SQL稍微更复杂的查询。 这里的原始查询的例子:
选择我,从销售WHERE is_paid =虚假或状态= 'toship' AND otherfield = '富' 和anotherfield = 'BAR' 字段
这很简单,它生成所有被is_paid =假,然后第二个结果,我和火柴的结果集。
现在我知道Q对象,我是知道的,但过滤我似乎无法环绕我的心如何在Django的ORM实现这个干净。
有小费吗?
谢谢
我希望创建一个写很容易使用原始SQL稍微更复杂的查询。 这里的原始查询的例子:
选择我,从销售WHERE is_paid =虚假或状态= 'toship' AND otherfield = '富' 和anotherfield = 'BAR' 字段
这很简单,它生成所有被is_paid =假,然后第二个结果,我和火柴的结果集。
现在我知道Q对象,我是知道的,但过滤我似乎无法环绕我的心如何在Django的ORM实现这个干净。
有小费吗?
谢谢
您可以继续建立您的问与答对象几分时尚动感。
例:
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)
虽然googletorp是正确的,你不能用字符串动态地构造查询,你可以用字典参数做到这一点。 就像是:
model.objects.filter(Q(**mydict1) | Q(**mydict2))
其中mydict1和2是以下形式:
{'field1': 'value1'}
{'field2__icontains': 'value2'}
等等
像这样的东西应该工作:
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:
...
这可能是比较复杂的,但我敢肯定你的想法。
这是做动态“或”查询一个伟大的方式:
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))