2016-06-09 1 views
0

У меня есть 2 модели: Project и ProjectTweet.Django queryset.query и запуск запроса в консоли mysql не дают того же результата

Проект имеет отношение OneToMany с ProjectTweet (родственное имя: "твиты")

Вот мой QuerySet:

current_pledge = 1000000 
projects = Project.objects.filter(state = "live").filter(pledged__gt=current_pledge).exclude(tweets__step__gte=current_pledge) 

И вот результат

print projects.query 


SELECT `ks_project`.* FROM `ks_project` WHERE (`ks_project`.`state` = live AND `ks_project`.`pledged` > 1000000.0 AND NOT (`ks_project`.`id` IN (SELECT U1.`project_id` AS Col1 FROM `ks_projecttweet` U1 WHERE U1.`step` >= 1000000))) 

(я» ve заменил длинный список полей на ks_project. * только для постчитаемости)

Этот запрос вычисляется в django, дайте мне 0 результат, но я должен его иметь.

И в самом деле, когда я скопировать запрос в тузде консоли (тот же пользователь) я получить свой уникальный результат ... (просто добавить цитату в строку, так как они добавляются только тогда, когда evaluting запроса, как это сказано в: Potential Django Bug In QuerySet.query?)

Любая идея о том, что вызывает эту разницу?

+0

Я протестировал его без первого фильтра (state = "live"), и он по-прежнему дает мне 0 результат (и более одного, как и ожидалось в консоли mysql). Вот запрос (немного проще предыдущего) 'SELECT' ks_project'. * FROM 'ks_project' WHERE (' ks_project'.'pledged'> 1000000.0 AND NOT ('ks_project'.'id' IN (SELECT U1.'project_id' AS Col1 FROM' ks_projecttweet' U1 WHERE U1. 'step'> = 1000000)))' – Kemical

+0

Простейшим объяснением является то, что Django использует другую копию базы данных, чем тот, который вы просматриваете в консоли. Возможно ли это? – evergreen

+0

Нет, я использую созданную django ORM: /, я предполагаю, что это может иметь какое-то отношение к промежуточной операции, выполненной непосредственно перед оценкой запроса (то же самое, что и строки кавычек). Но даже если в этом случае я увижу другой вариант (сделайте два запроса и разницу между вместо использования "exclude" метод), я хотел бы полагаться на queryset.query для отладки моих запросов ... – Kemical

ответ

0

Я не знаю, как я мог пропустить это, но мое поле «шага», что я сравниваю с помощью .exclude(tweets__step__gte=current_pledge)

является CharField вместо FloatField ... Я изменить это и теперь запрос в тузде консоли и queryset дают мне тот же результат. Однако я хотел бы ошибку вместо того, чтобы дать мне 0 результат

не может использовать GTE с CharField

или что-то в этом роде.

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

  • Нет связанных вопросов^_^