【问题标题】:django queryset - searching for firstname and lastnamedjango queryset - 搜索名字和姓氏
【发布时间】:2012-02-19 01:05:46
【问题描述】:

我有一个 django 应用程序,可以从单个用户表中检索所有主题。我还实现了一个输入搜索表单, 这是执行的查询:

all_soggs =     Entity.objects.filter(lastname__istartswith=request.GET['query_term']).order_by('lastname')
if(all_soggs.count()==0):
    all_soggs = Entity.objects.filter(firstname__istartswith=request.GET['query_term']).order_by('firstname')

如您所见,该查询首先按姓氏搜索匹配项,然后按名字搜索。这一直有效,直到我插入完整的名称“firstaname lastname”或“lastname firstname”,在这种情况下没有结果。如何修改查询以进行更好的搜索?

谢谢 - 卢克

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案1】:

    复制/粘贴自:https://stackoverflow.com/a/17361729/1297812

    from django.db.models import Q 
    
    def find_user_by_name(query_name):
       qs = User.objects.all()
       for term in query_name.split():
         qs = qs.filter( Q(first_name__icontains = term) | Q(last_name__icontains = term))
       return qs
    

    【讨论】:

      【解决方案2】:

      You need Q objects 并且您还需要将查询拆分为单独的术语(因为没有名字会匹配完整的字符串“Firstname Lastname”)。

      这是一个在搜索“Firstname Lastname”中匹配任何以“Firstname”或“Lastname”开头的名字或姓氏的想法。

      这是一个通用搜索 - 调整查询以满足您的特定需求!

      编辑:哎呀,我真的不喜欢使用 reduce,因为它看起来很混乱,但是这些需要 ORed 在一起,我们不能做一个更详细的版本,因为术语的数量是未知的。

      import operator
      from django.db.models import Q
      
      search_args = []
      for term in request.GET['query_term'].split():
          for query in ('first_name__istartswith', 'last_name__istartswith'):
              search_args.append(Q(**{query: term}))
      
      all_soggs = Entity.objects.filter(reduce(operator.or_, search_args))
      

      为了阐明如何使用 Q 对象,给定搜索“Firstname Lastname”,前面的查询等于:

      Entity.objects.filter(
          Q(first_name__istartswith="Firstname") | Q(last_name__istartswith="Firstname") |
          Q(first_name__istartswith="Lastname") | Q(last_name__istartswith="Lastname")
          )
      

      【讨论】:

        【解决方案3】:

        类似问题:Querying full name in Django

        query = request.GET.get('query')
        entities = []
        
        try:
            firstname = query.split(' ')[0]
            lastname  = query.split(' ')[1]
            entities += Entity.objects.filter(firstname__icontains=firstname,lastname__icontains=lastname)
            entities += Entity.objects.filter(firstname__icontains=lastname,lastname__icontains=firstname)
        
        entities = set(entities)
        

        【讨论】:

        • 回答两次问题并参考您自己的答案有什么意义?
        • 根据堆栈溢出规则,即使引用链接也必须给出完整的答案,因为链接可能会损坏
        猜你喜欢
        • 2023-03-19
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 2021-11-29
        • 2021-07-14
        相关资源
        最近更新 更多