【问题标题】:How to execute Django Query as string如何以字符串形式执行 Django Query
【发布时间】:2018-09-19 16:48:25
【问题描述】:

我想在 Django ORM 中进行这样的查询:

query_string = "optionA=True,optionB=True,optionC=True"
data = ModelObject.objects.filter(query_string)

此代码给出以下错误:

Traceback (most recent call last):
File "/root/hellomeets/.env/hellomeets/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/root/hellomeets/.env/hellomeets/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/root/hellomeets/.env/hellomeets/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/root/hellomeets/.env/hellomeets/local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
return view_func(*args, **kwargs)
File "/root/hellomeets/.env/hellomeets/local/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "/root/hellomeets/.env/hellomeets/local/lib/python2.7/site-packages/rest_framework/views.py", line 483, in dispatch
response = self.handle_exception(exc)
File "/root/hellomeets/.env/hellomeets/local/lib/python2.7/site-packages/rest_framework/views.py", line 443, in handle_exception
self.raise_uncaught_exception(exc)
File "/root/hellomeets/.env/hellomeets/local/lib/python2.7/site-packages/rest_framework/views.py", line 480, in dispatch
response = handler(request, *args, **kwargs)
File "/root/hellomeets/hellomeets/frontend/views.py", line 74, in post
filtered_emails = HelloMeetsMailList.objects.filter(final_query)
File "/root/hellomeets/.env/hellomeets/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/root/hellomeets/.env/hellomeets/local/lib/python2.7/site-packages/django/db/models/query.py", line 784, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "/root/hellomeets/.env/hellomeets/local/lib/python2.7/site-packages/django/db/models/query.py", line 802, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/root/hellomeets/.env/hellomeets/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1250, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "/root/hellomeets/.env/hellomeets/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1276, in _add_q
allow_joins=allow_joins, split_subq=split_subq,
File "/root/hellomeets/.env/hellomeets/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1151, in build_filter
arg, value = filter_expr
ValueError: too many values to unpack

我也试过 eval() 但它没有用。 有什么办法让我不需要编写原始的 sql 查询

【问题讨论】:

  • 你是怎么把这个放在first的地方的?处理查询的方法看起来有问题,甚至可能容易出错、黑客攻击等。
  • re sugiero realizar algo como esto: stackoverflow.com/questions/7212847/…

标签: django django-models


【解决方案1】:
from django.db.models import Q

query_string=Q(optionA=True) & Q(optionB=True) & Q(optionC=True)
data = ModelObject.objects.filter(query_string)

更多详情: https://docs.djangoproject.com/en/2.1/topics/db/queries/#complex-lookups-with-q-objects

【讨论】:

    【解决方案2】:

    如果您真的需要使用该字符串(这似乎是一种非常笨拙的方式来查询 Django 模型),您可以将其拆分并转换为 dict:

    s = "optionA=True,optionB=True,optionC=True"
    kwargs = {}
    for e in s.split(','):
        k, v = e.split('=')
        kwargs[k] = bool(v)
    

    然后在 filter() 方法中解压该字典

    data = ModelObject.objects.filter(**kwargs)
    

    但这并不是真的推荐!!!

    【讨论】:

    • 谢谢,这正是我要找的。尽管这些查询仅在内部服务内部传递。
    猜你喜欢
    • 2014-01-29
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 2015-11-03
    • 2022-11-22
    • 2016-08-06
    相关资源
    最近更新 更多