Django Queryset 用于连接查询 first_name 和 last_name 的全名

Axi*_*xil 4 python django search concat django-queryset

我想在 Django 中进行全名 (first_name concat last_name) 搜索/查询。

以下是我的模型:

class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='employee')
    company = models.ForeignKey(Company)
    username = models.CharField(max_length=30, blank=False)    
    first_name = models.CharField(max_length=30, blank=False)
    last_name = models.CharField(max_length=30, blank=False)    
    created_at = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

例如,我们有一个这样的条目。名字:“迈克尔”,姓氏:“杰克逊”

我希望能够查询全名“迈克尔杰克逊”。如果可以在不区分大小写的情况下显示也很棒。

这个其他的 stackoverflow 问题是类似的,但答案没有满足在 Django中正确查询全名中的这个特殊要求。我们希望能够进行连续搜索。

我尝试使用 annotate 但它不起作用

queryset = Employee.objects.annotate(fullname=Concat('first_name', 'last_name'))
search_result = queryset.filter(fullname__icontains='michael jackson')
Run Code Online (Sandbox Code Playgroud)

Axi*_*xil 8

这有效。

from django.db.models.functions import Concat
from django.db.models import Value

queryset = Employee.objects.annotate(fullname=Concat('first_name', Value(' '), 'last_name'))
c = queryset.filter(fullname__icontains='michael jackson')
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,如果存在 middle_name,则 ```queryset = Employee.objects.annotate(fullname=Concat('first_name', Value(' '), 'middle_name', Value(' '), 'last_name', ))``` 这里,如果中间名空白,那么该值将为“michael jackson”。那么就不会被搜索了。因为这里包括两个空格。@阿克西尔 (3认同)