当我使用原始sql作为变量说myvar = some rawsql
时,当我在检查myvar
的查询条件时,它总是正确的。
{% if myvar %}
do this;
{% else %}
do this;
{% endif %}
例如我的原始sql返回0记录然后我想显示一些消息,但我无法做到这一点。当我调试在后台发生什么时,我的原始sql总是返回一些对象(<RawQuerySet: "sel
),尽管sql获取空记录。这就是为什么myvar总是正确的,因为它持有一些原始查询集的对象。
有没有办法解决这种情况
提前致谢
答案 0 :(得分:1)
>>> Author.objects.raw("""select * from stack_author where id = 5""")
<RawQuerySet: 'select * from stack_author where id = 5'>
>>> list(_)
[]
>>>
>>> if Author.objects.raw("""select * from stack_author where id = 5"""):
... print 'yes'
...
yes
您可以通过传递列表而不是原始查询集来避免这种情况:
>>> if list(Author.objects.raw("""select * from stack_author where id = 5""")):
... print 'yes'
...
>>>
切片也有效:
>>> if Author.objects.raw("""select * from stack_author where id = 5""")[:]:
... print 'yes'
...
>>>
您还可以在视图中评估qs并将布尔结果传递给模板。
注意Indexing会在空的原始qs上引发IndexError:
>>> if Author.objects.raw("""select * from stack_author where id = 5""")[0]:
... print 'yes'
...
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/dennisting/.virtualenvs/django-sb/lib/python2.7/site-packages/django/db/models/query.py", line 1379, in __getitem__
return list(self)[k]
IndexError: list index out of range
如果你正在迭代,使用for循环也可以,这取决于你想要做的事情:
>>> for author in Author.objects.raw("""select * from stack_author where id = 5"""):
... print author
...
>>>