2010-09-09 75 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