我想弄清楚如何基于列的组合进行查询,例如用户的全名,而不需要任何自定义SQL。这可能吗?
想象一下 User.objects.filter(firstname__concat__lastname__startswith =“Barack Ob”)
我知道在这个特定的例子中,通过whitspace分割“Barack Ob”并修改查询很容易,但是可以对这样的列组合进行查询吗?
答案 0 :(得分:1)
使用当前的Django ORM,不,它不存在。您可以访问Q对象查询处理程序。
User.objects.filter(Q(firstname__startswith=name.split(" ", 1)[0]), Q(lastname__startswith=name.split(" ", 1)[1]))
答案 1 :(得分:1)
如果您的数据库支持全文搜索,则可以解决您的问题的可能解决方案。我使用Postgresql(see documentation)并能够进行以下查询:
print User.objects.all().extra(where =
["to_tsvector(coalesce(first_name) || coalesce(last_name))
@@ to_tsquery('BarackObama')"])
您会注意到我在查询中使用了全名。我对文本搜索的了解有限,我不知道是否有办法相当于__startswith
(使用LIKE
实现)。
我怀疑这对你的需求来说太过分了。您可能最好添加自定义字段或自定义方法或两者的组合来实现此目的。