если тег не работает при использовании raw sql в шаблоне django - PullRequest
2 голосов
/ 20 мая 2011

Когда я использую raw sql для переменной, скажем myvar = some rawsql и когда я проверяю, есть ли условие в запросе для myvar, это всегда верно.

{% if myvar %}
 do this;
{% else %}
 do this;
{% endif %}

Например, мой raw sql возвращает 0 записей, тогда я хочу показать какое-то сообщение, но я не смог этого сделать.Когда я отлаживаю то, что происходит в фоновом режиме, мой сырой sql всегда возвращает некоторый объект (<RawQuerySet: "sel), хотя sql выбирает пустые записи.Вот почему myvar всегда имеет значение true, потому что содержит некоторый объект необработанного набора запросов.

Есть ли способ получить сет в этой ситуации

Заранее спасибо

1 Ответ

1 голос
/ 20 мая 2011
>>> 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 в представлении и передать логический результат в шаблон.


Осторожно, индексирование вызовет ошибку IndexError для пустой строки qs:

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