【问题标题】:Query based on a composition of columns in Django基于 Django 中的列组合的查询
【发布时间】:2010-09-09 15:55:55
【问题描述】:

我想弄清楚如何在不使用任何自定义 SQL 的情况下根据列的组合进行查询,例如用户的全名。这可能吗?

想象一下 User.objects.filter(firstname__concat__lastname__startswith="Barack Ob")

我知道在这个特定的示例中,将“Barack Ob”通过 whitspace 拆分并修改查询很容易,但是是否可以对这样的列组合进行查询?

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    如果您的数据库支持全文搜索,则可以为您的问题找到可能的解决方案。我使用 Postgresql (see documentation) 并且能够使以下查询工作:

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

    您会注意到我在查询中使用了全名。我对文本搜索的了解有限,不知道有没有办法相当于__startswith(使用LIKE实现)。

    我怀疑这对您的需求来说太过分了。您最好添加自定义字段或自定义方法或两者的组合来实现这一点。

    【讨论】:

    • 我想要的每个列组合的自定义字段对内存非常不利。自定义方法意味着过滤是在 python 端完成的,而不是由 RDBMS 完成。
    【解决方案2】:

    使用当前的 Django ORM,不,它不存在。您确实有权访问 Q 对象查询处理程序。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-27
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 2020-08-31
      • 2021-04-06
      相关资源
      最近更新 更多