2016-05-10 68 views
2

與伯爵,F對象和整數Django的組合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'")


令人驚訝的註釋,當我遇到一個問題計數「在having子句未知列」它的工作原理,如果我改變的順序:

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

到:

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

但不幸的是我被鎖定在訂單(我舉了一個簡單的例子)。我在做實際的註釋是類似於:

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

不能重新排列:(

它的查詢也可以工作:

  • 沒有過濾器()
  • 沒有計數()
  • 通常在SQLite3上

我正在執行查詢的表是一個沉重的河馬,所以我不能做任何python級別的處理。我試着將它分成不同的註釋,使用Case/When來捕獲任何div 0錯誤,並將計算移動到filter(),但無濟於事。

我做錯了什麼?我應該打開一張票嗎?請幫我先生上網。

Django的:1.9.6 - - MySQL的:5.7.11 - - 的Python:2.7.10 - - OSX:10.11.4

+0

難道可能是因爲您使用的是保留字「整數」作爲註釋和列名稱? – e4c5

+1

整數不是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

我真的沒有一個想法,爲什麼在這種情況下,改變的順序是有意義的,但我發現,當發生錯誤喲在集合之後嘗試使用.count(),如果我嘗試使用.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