使用滤波器()和Q对象的混合物A的Django ORM查询(A Django ORM query u

2019-09-20 05:15发布

我希望创建一个写很容易使用原始SQL稍微更复杂的查询。 这里的原始查询的例子:

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

这很简单,它生成所有被is_paid =假,然后第二个结果,我和火柴的结果集。

现在我知道Q对象,我是知道的,但过滤我似乎无法环绕我的心如何在Django的ORM实现这个干净。

有小费吗?

谢谢

Answer 1:

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

例:

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)


Answer 2:

虽然googletorp是正确的,你不能用字符串动态地构造查询,你可以用字典参数做到这一点。 就像是:

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

其中mydict1和2是以下形式:

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

等等



Answer 3:

像这样的东西应该工作:

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:
    ...

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



Answer 4:

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

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))


文章来源: A Django ORM query using a mix of filter() and Q objects