2016-11-15 2 views
5

Я создаю запрос на Django вручную и хочу просто использовать ORM Django, чтобы прочитать полученный SQL Queryet.query сам без попадания в мою БД.Как определить, был ли обработан QuerySet Django?

Я знаю, Django quersets ленивы, и я вижу все опа, которые вызывают QuerySet оцениваемой:

https://docs.djangoproject.com/en/1.10/ref/models/querysets/#when-querysets-are-evaluated

... Но что, если я просто хочу, чтобы проверить мой код чисто строит QuerySet кишки, но НЕ оценивает и не ударяет по моей БД еще непреднамеренно? Существуют ли какие-либо атрибуты на объекте запроса, который я могу использовать для проверки того, что он не был оценен без фактической оценки его?

+0

Я так не думаю, я думаю, что такого использования не требуется. Зачем вам такая функция? –

+0

У меня есть другие виды использования для SQL, которые создает Django ORM, чем фактическая оценка его немедленно. – slumtrimpet

ответ

5

Для querysets, которые используют select возвращать списки экземпляров модели, как основной фильтр или исключить, атрибут _result_cache является None если QuerySet не был оценен, или список результатов, если он имеет. Применяются обычные оговорки о непубличных атрибутах.

Для других запросов (количество, удаление и т. Д.) Я не уверен, что есть простой способ. Может быть, смотреть журналы базы данных, или работать в режиме DEBUG и проверить connection.queries, как описано здесь: https://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running

+0

Отлично, спасибо большое. – slumtrimpet

+0

@slumtrimpet - обновлен, чтобы отразить то, что работает для запросов, которые используют SELECT SQL для извлечения записей, но не обязательно для всех запросов. –

1

Для тех, кто хочет знать когдаQuerySet s оцениваются: это когда они итерация, нарезанный, маринованные или кэшируется, магнезии() 'д, Len()' D, список() «изд или BOOL() 'ed. См. https://docs.djangoproject.com/en/1.10/ref/models/querysets/#when-querysets-are-evaluated

+2

Это ссылка, которую дал ОП в вопросе. Вопрос не в том, «когда Django оценивает набор запросов», вопрос: «Учитывая объект запроса, как я могу определить, была ли эта оценка уже оценена». Посмотрите исходный код, чтобы наблюдать, как изменяется '_result_cache' во время этих операций: https://github.com/django/django/blob/master/django/db/models/query.py –

+0

@PeterDeGlopper о, да, я так извините, вы совершенно правы. Я отредактирую ответ, чтобы он был информативным для людей, которые хотели бы знать, когда Django оценивает его. – feakuru

Смежные вопросы