【发布时间】:2010-09-09 15:55:55
【问题描述】:
我想弄清楚如何在不使用任何自定义 SQL 的情况下根据列的组合进行查询,例如用户的全名。这可能吗?
想象一下 User.objects.filter(firstname__concat__lastname__startswith="Barack Ob")
我知道在这个特定的示例中,将“Barack Ob”通过 whitspace 拆分并修改查询很容易,但是是否可以对这样的列组合进行查询?
【问题讨论】:
我想弄清楚如何在不使用任何自定义 SQL 的情况下根据列的组合进行查询,例如用户的全名。这可能吗?
想象一下 User.objects.filter(firstname__concat__lastname__startswith="Barack Ob")
我知道在这个特定的示例中,将“Barack Ob”通过 whitspace 拆分并修改查询很容易,但是是否可以对这样的列组合进行查询?
【问题讨论】:
如果您的数据库支持全文搜索,则可以为您的问题找到可能的解决方案。我使用 Postgresql (see documentation) 并且能够使以下查询工作:
print User.objects.all().extra(where =
["to_tsvector(coalesce(first_name) || coalesce(last_name))
@@ to_tsquery('BarackObama')"])
您会注意到我在查询中使用了全名。我对文本搜索的了解有限,不知道有没有办法相当于__startswith(使用LIKE实现)。
我怀疑这对您的需求来说太过分了。您最好添加自定义字段或自定义方法或两者的组合来实现这一点。
【讨论】:
使用当前的 Django ORM,不,它不存在。您确实有权访问 Q 对象查询处理程序。
User.objects.filter(Q(firstname__startswith=name.split(" ", 1)[0]), Q(lastname__startswith=name.split(" ", 1)[1]))
【讨论】: