我想運行通過ORM,看起來像這樣的Django的更新:我可以在字符串連接中使用Django F()對象嗎?
MyModel.objects.filter(**kwargs).update(my_field=F('my_other_field')+'a string')
這導致MySQL拋出異常。無論如何沒有寫入原始SQL來做到這一點?
我想運行通過ORM,看起來像這樣的Django的更新:我可以在字符串連接中使用Django F()對象嗎?
MyModel.objects.filter(**kwargs).update(my_field=F('my_other_field')+'a string')
這導致MySQL拋出異常。無論如何沒有寫入原始SQL來做到這一點?
發生了什麼是Django正在將'+'傳遞給SQL - 但SQL不允許使用'+'進行連接,所以它會嘗試添加數字。如果你用一個整數來代替'一個字符串',它的確可以工作,因爲它將整數值my_other_field
添加到你的變量中。
這是一個錯誤是值得商榷的。在查找查詢的documentation for F()
objects指出:
Django支持與
F()
對象
,因此可以說,你不應該試圖運用加,減,乘,除和模運算用它來更新字符串。但是這當然沒有記錄,並且錯誤消息「不正確的DOUBLE值」不是很有幫助。我會打開一張票。
您可以使用的毗連功能https://docs.djangoproject.com/en/1.9/ref/models/database-functions/#concat
from django.db.models.functions import Concat
from django.db.models import Value
MyModel.objects.filter(**kwargs).update(my_field=Concat('my_other_field', Value('a string'))
我有一個類似的問題;基本上我想連接兩個字段來獲取用戶的全名。我把它解決了這個辦法(但必須說,我使用的是Postgres):
from django.db.models.functions import Concat
from django.db.models import F, Value, CharField
AnyModel.objects.filter(**kwargs).annotate(full_name=Concat(F('model__user_first_name'), Value(' '), F('model__user_last_name'), output_field=CharField()))
其中,F(「...」)評估其作爲查詢參數,這樣你就可以查詢的字段模型本身,或者跨越模型,就像你在filter/get中做的那樣,而Value('...')直接評估它的參數(在我的情況下我需要在first_name和last_name之間放置一個空格),和output_field = ...指定了註釋字段的類型(我想成爲CharField)。 欲瞭解更多信息,你可以閱讀Django docs about Concat
希望這將有助於有人在那裏。乾杯
這是一個很好的答案,按預期工作。 – ihhcarus 2016-10-08 13:09:12
這是一個很好的答案,按預期工作。 – 2017-09-11 21:18:31
感謝您的詳細回覆 – Zach 2010-07-22 02:23:59
在SQLite中它甚至沒有什麼幫助:它只是將文本設置爲「0」! – boxed 2015-02-05 13:15:18