如何将复杂的 Django 查询构建为字符串 [英] How to build complex django query as a string

查看:33
本文介绍了如何将复杂的 Django 查询构建为字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在动态生成具有多个参数的查询字符串.我试图在我的字符串中包含对象名称('nut'、'jam').查询必须是OR"查询.我的代码在下面,我收到如下所示的错误.解决方案这里此处此处 对我不起作用.

I am dynamically generating a query string with multiple parameters. I am trying to include the object names ('nut', 'jam') in my string. The query has to be an "OR" query. My code is below and I get the error shown below. The solutions here, here, and here did not work for me.

from viewer.models import Model1
from django.db.models import Q
list1 = [
    {'nut' : 'peanut', 'jam' : 'blueberry'},
    {'nut' : 'almond', 'jam' : 'strawberry'}
]
query_string = ""
for x in list1:
    if len(query_string) == 0:
        query_string = "Q(nut='%s', jam='%s')" % (x["nut"], x["jam"])
    else:
        query_string = "%s | Q(nut='%s', jam='%s')" % (query_string, x["nut"], x["jam"])
print query_string # correctly prints Q(nut='peanut', jam='blueberry') | Q(nut='almond', jam='strawberry')
query_results = Model1.objects.filter(query_string)

Error: 
#truncated
File "/Library/Python/2.7/site-packages/Django-1.5.4-py2.7.egg/django/db/models/manager.py", line 155, in filter
    return self.get_query_set().filter(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/Django-1.5.4-py2.7.egg/django/db/models/query.py", line 669, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/Library/Python/2.7/site-packages/Django-1.5.4-py2.7.egg/django/db/models/query.py", line 687, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/Library/Python/2.7/site-packages/Django-1.5.4-py2.7.egg/django/db/models/sql/query.py", line 1271, in add_q
can_reuse=used_aliases, force_having=force_having)
  File "/Library/Python/2.7/site-packages/Django-1.5.4-py2.7.egg/django/db/models/sql/query.py", line 1066, in add_filter
arg, value = filter_expr
ValueError: too many values to unpack

推荐答案

构造一个 Q 对象并在 filter() 中使用它:

Construct a Q object and use it in filter():

from viewer.models import Model1
from django.db.models import Q

list1 = [
    {'nut' : 'peanut', 'jam' : 'blueberry'},
    {'nut' : 'almond', 'jam' : 'strawberry'}
]

q = Q()
for x in list1:
    q.add(Q(**x), Q.OR)

query_results = Model1.objects.filter(q)

或者,您可以使用 operator.or_ 加入Q 对象列表:

Or, you can use operator.or_ to join the list of Q objects:

import operator
from viewer.models import Model1
from django.db.models import Q

list1 = [
    {'nut' : 'peanut', 'jam' : 'blueberry'},
    {'nut' : 'almond', 'jam' : 'strawberry'}
]

query_results = Model1.objects.filter(reduce(operator.or_, 
                                             [Q(**x) for x in list1]))

这篇关于如何将复杂的 Django 查询构建为字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆