Django:可以在带注释的字段上使用过滤器吗?

时间:2019-02-22 17:49:37

标签: sql django

例如,如果我想同时搜索用户的姓氏和名字:

我尝试过此方法,但不起作用:

qs = User.objects.all().annotate(name=F('first_name') + ' ' + F('last_name'))
qs = qs.filter(name__icontains='foo bar')

此事件可能在SQL中发生吗?

1 个答案:

答案 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%