如何在 Django 搜索方法中使用 space 搜索字符串?

how to search a string with space in django search method?

当我同时搜索 first_namelast_name 字段时,它不会显示结果

例如:serch_text =“哈利·波特” 它不包括 space?

views.py

def get(self, request, *args, **kwargs):
    if request.is_ajax():
        search_text = request.GET.get('search')
        if search_text is not None and search_text != u"":
            search_text = request.GET.get('search')
            print(search_text)
            wallets = Wallet.objects.filter(Q(user__customer__first_name__icontains=search_text) |
                                            Q(user__customer__last_name__icontains=search_text) |
                                            Q(user__customer__email__icontains=search_text) |
                                            Q(user__customer__phone__icontains=search_text))
        else:
            wallets = Wallet.objects.all()
        html = render_to_string('customer/wallet-filter.html', {'wallets': wallets},
                                request)
        return JsonResponse({'html': html})

    wallets = Wallet.objects.all().order_by('-id')
    

    return render(request, 'customer/wallets.html', {'wallets': wallets})

如果您使用 icontains,过滤器将检查您的任何模型字段是否完全包含字符串 'harry potter'。

如果 search_text 可以包含多个由空格分隔的字符串,您可以将这些名称拆分成一个列表。然后您的过滤器可以检查您的模型字段是否匹配这些搜索字符串之一。

search_text  = search_text.split(' ')  # Split search_text into list of multiple strings

wallets = Wallet.objects.filter(
    Q(user__customer__first_name__in=search_text) |  
    Q(user__customer__last_name__in=search_text) | 
    Q(user__customer__email__in=search_text) |        
    Q(user__customer__phone__in=search_text)
)

编辑 如果名字和姓氏都应与搜索文本匹配,则必须使用此处所述的两个过滤语句:

wallets = Wallet.objects.filter(
    Q(user__customer__first_name__in=search_text)
).filter(    
    Q(user__customer__last_name__in=search_text) | 
)

我们可以使用注释方法

wallets = Wallet.objects.annotate(
                fullname=Concat('user__customer__first_name', Value(' '), 'user__customer__last_name')).filter(
                Q(user__customer__first_name__icontains=search_text) |
                Q(user__customer__last_name__icontains=search_text) |
                Q(user__customer__email__icontains=search_text) |
                Q(user__customer__phone__icontains=search_text) | Q(fullname__icontains=search_text))