【问题标题】:Django: Q Objects concatenationDjango:Q 对象连接
【发布时间】:2019-09-30 19:39:37
【问题描述】:

一直在尝试使用 Q 对象进行过滤,并且能够搜索“名字”+“姓氏”,但只能搜索其中一个。谁能告诉我我做错了什么?

评估搜索视图

澄清:

ma = 员工编号

fornavn = 名字

efternavn = 姓氏

fagnavn = 主题名称

aktivitetnavn = 活动名称

vuderingsnavn = 等级

delingnavn = 部门(整数)

class SearchEvalueringer(ListView):
    model = Evaluering
    template_name = 'evalsys/categories/søg_evalueringer.html'

    def get_queryset(self):
        query = self.request.GET.get('q')
        if len(query) > 1:
            eval_list = Evaluering.objects.filter(
                Q(ma__ma__regex=query) |
                Q(ma__fornavn__iregex=query) |
                Q(ma__efternavn__iregex=query) |
                Q(fagnavn__fagnavn__iregex=query) |
                Q(aktivitetnavn__aktivitetnavn__iregex=query) |
                Q(vuderingsnavn__vuderingsnavn__iregex=query) |
                Q(ma__holdnavn__holdnavn__iregex=query)
            )
        else:
            eval_list = Evaluering.objects.filter(
                Q(ma__delingnavn__delingnavn__exact=query)
            )
        return eval_list

我试过这样做:

Q(ma__fornavn__iregex=query) & Q(ma__efternavn__iregex=query)

但这并不能让我搜索“John Smith”,仍然只能搜索“John”或“Smith”。

【问题讨论】:

    标签: django django-views django-filter


    【解决方案1】:

    您可以尝试类似的方法,通过连接名字和姓氏将 full_name 注释到查询集上,然后对其进行过滤。

    from django.db.models import CharField, Value
    from django.db.models.functions import Concat
    
    queryset.objects.annotate(
        full_name=Concat(
            "first_name", Value(" "), "last_name", 
            output_filed=CharField()
        ).filter(
            full_name=query
        )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 2020-06-30
      相关资源
      最近更新 更多