例如,如果我想同时搜索用户的姓氏和名字:
我尝试过此方法,但不起作用:
qs = User.objects.all().annotate(name=F('first_name') + ' ' + F('last_name'))
qs = qs.filter(name__icontains='foo bar')
此事件可能在SQL中发生吗?
答案 0 :(得分:3)
是的,您可以为此使用Concat
[Django-doc]表达式:
from django.db.models import Value
from django.db.models.functions import Concat
User.objects.annotate(
name=Concat('first_name', Value(' '), 'last_name')
).filter(
name__icontains='foo bar'
)
Django会将其转换为如下查询:
SELECT `auth_user`.*,
CONCAT_WS('', `auth_user`.`first_name`, CONCAT_WS('', , `auth_user`.`last_name`)) AS `name`
FROM `auth_user`
WHERE CONCAT_WS('', `auth_user`.`first_name`, CONCAT_WS('', , `auth_user`.`last_name`)) LIKE %foo bar%