2011-08-31 21 views
3

我想選擇一個字段是字符串和列值串聯的行。這是最接近我可以得到:Django select字段是字符串和列值的串聯

qs = Report.objects.filter(job=self, persona__identity="u" + F("user__id")) 

報告具有字段的角色和用戶。角色對象包含標識符和ID串聯的標識字段。我試圖獲取角色的身份字符串與報告引用的用戶相匹配的所有報告。 (注意,這些都不是我實際的表名......改變,以保護無辜的一切。)

這將產生一個查詢類似,

WHERE (`persona`.`identity` = u + `report`.`user_id` AND ... 

,但我真正需要的是一樣的東西

WHERE (`persona`.`identity` = CONCAT("u", `report`.`user_id`) AND ... 

有沒有辦法與ORM做到這一點?

+0

你considedered改變Persona.identity到reular FK到用戶表(而不是 'U' + id)的?如果您想提供數據完整性,則建議使用IMO。 – dzida

回答

4

您可以使用extra來定義原始SQL中的查找。喜歡的東西:

Report.objects.extra({ 
    where=['(`persona`.`identity` = CONCAT("u", `report`.`user_id`)'] 
}) 

也有一些缺點,使用原始的SQL語句,如不是在不同的數據庫引擎移植代碼,但對於複雜的查詢,這是遠遠比試圖鞋拔子的解決方案到ORM更具表現力。

+0

明白了!謝謝。我最終需要做Report.objects.select_related()。extra(...),以便它能夠正確地執行連接,但是這個工作正常! –

+0

很高興我能幫到你。放入原始SQL有其缺點,但對於這種情況,有時候沒有其他選擇。 –

1

替代在Django 1.8可用:

from django.db.models import Value 
from django.db.models.functions import Concat 

Report.objects.filter(persona__identity=Concat(Value('u'), 'user__id'))