2016-05-10 2 views
2

Я сталкивался с вопросом, когда аннотирования с графом, F объектом и целогоДжанго «Неизвестный столбец, имеющий пункт» при объединении F и граф в аннотации

class Task(models.Model): 
    my_integer = models.IntegerField() 

class User(models.Model): 
    task = models.ForeignKey("Task", related_name="users") 


Task.objects.annotate(
    sum= 1 + F('my_integer') + Count('users') 
).filter(
    sum= 10 
).count() 

OperationalError: (1054, "Unknown column 'bug_example_task.my_integer' in 'having clause'")


Неожиданно это работает, если изменить порядок:

1 + F('my_integer') + Count('users') 

к:

F('my_integer') + Count('users') + 1 

Но, к сожалению, я заперт в порядке (я привел минимальный пример). Фактическая аннотацию я делаю аналогично:

(my_variable/F('my_integer'))%Count('users') 

, которые не могут быть перестроены :(

Это запрос также работает:

  • без фильтра()
  • без count()
  • обычно на SQLite3

Таблица, в которой я выполняю запрос, является здоровенным гиппопотамом, поэтому я не могу позволить себе обрабатывать уровень на уровне python. Я попытался разделить его на разные аннотации, используя Case/When, чтобы поймать любые ошибки div 0, а также и переместить вычисления в фильтр(), но безрезультатно.

Я что-то не так? я должен открыть билет? Пожалуйста, помогите мне в интернете.

Джанго: 1.9.6 - - MySql: 5.7.11 - - Python: 2.7.10 - - OSX: 10.11.4

+0

Могло ли быть, потому что вы используете зарезервированное слово «целое», как аннотации и колонки имя? – e4c5

+1

integer не является зарезервированным словом в python/django. Фактическое имя, которое я использовал, было другим, я просто использовал его в качестве примера: P – Dean

+0

https://dev.mysql.com/doc/refman/5.6/en/integer-types.html – e4c5

ответ

2

you are using a python key word integer which Django does not allow : Read here for more about field-name-restrictions

Я проверил необработанный запрос в обоих случаях порядка, но агрегация является сохранение того же порядка на уровне БДА:

HAVING (1 + F('my_integer') + Count('users')) < 12

Я действительно не имею представления о том, почему изменяющихся вопросах порядка в этом случае, но я обнаружил, что эта ошибка возникает, когда йо u попытайтесь использовать .count() после aggreration, такая же ошибка будет также, если я попытаюсь использовать .aggregate(Count('sum')). Поэтому я предлагаю использовать просто len, несмотря на это, не оптимизированный способ, но я надеюсь, что это может быть полезно сейчас:

len(Task.objects.annotate(
    sum= 1 + F('my_integer') + Count('users') 
).filter(
    sum= 10 
)) 
+1

Я обновил вопрос с помощью «integer» -> «my_integer», и я все еще сталкиваюсь с тем же вопросом. – Dean

+1

Спасибо, что подтвердили странность!Из-за размера таблицы я не могу использовать len(), поэтому я вернулся к необработанному запросу, что заставляет меня кричать каждую ночь: «(Думаю, что я отправлю билет django, когда я подберусь к нему Еще раз спасибо – Dean

+0

Держите это сообщение актуальным, если у вас есть новости;) Мне действительно интересно узнать, как это можно было бы лучше всего решить. – DhiaTN

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

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