2010-09-09 90 views
1

我想弄清楚如何基於列的組合(例如用戶的全名)來查詢,而無需任何自定義SQL。這可能嗎?基於Django中列的組合查詢

想象像 User.objects.filter(firstname__concat__lastname__startswith =「巴拉克鄂畢」)

我知道,在這個特殊的例子,這將會是很容易通過whitspace分裂「巴拉克鄂」,並修改查詢,但是有可能對這樣的列組合進行查詢嗎?

回答

1

如果您的數據庫支持全文搜索,可以解決您的問題。我使用PostgreSQL(see documentation),並能夠使下面的查詢工作:

print User.objects.all().extra(where = 
    ["to_tsvector(coalesce(first_name) || coalesce(last_name)) 
     @@ to_tsquery('BarackObama')"]) 

你會注意到,我在查詢中使用的全名。我對文本搜索的知識是有限的,我不知道是否有辦法做到相當於__startswith(使用LIKE實現)。

我懷疑這對您的需求是一種矯枉過正。您最好添加一個自定義字段或自定義方法或兩者的組合來實現此目的。

+0

我想要的列的每個組合的自定義字段將是非常糟糕的內存。自定義方法意味着過濾在python一側完成,而不是由RDBMS完成。 – 2010-09-10 02:22:01

1

使用當前的Django ORM,不,它不存在。您可以訪問Q對象查詢處理程序。

User.objects.filter(Q(firstname__startswith=name.split(" ", 1)[0]), Q(lastname__startswith=name.split(" ", 1)[1])) 
+1

我可以用Q對象完成同樣的查詢。 – 2010-09-10 02:19:42