PsuedoCode for Model名为Person:
id = primary key
first_name = charField...
last_name = charField...
我的查询:
queryset_list = Person.objects.filter(Q(id__icontains=id_filter) & (Q(first_name__icontains=name_filter) | Q(last_name__icontains=name_filter)))
id_filter和name_filter来自表单。如果name_filter是" Betty",则名为Betty Bee的人出现。 但是,我的问题是如果name_filter是"贝蒂B",什么都不会出现(可以理解)。我将如何进行类似的搜索:
Q( (first_name + last_name)__icontains=name_filter )?
编辑 - 似乎更多细节会有所帮助,因为我稍微简化了问题。我在本地使用SQLite数据库,在生产中使用MySQL数据库。此外,我实际上正在使用与人员模型分开的学生模型。
Based on the best answer so far:
students.filter(Q(id__icontains=id_filter)).extra(
where=['lower(concat(base_Base_person.first_name, " ", base_Base_person.last_name)) like %s'],
params=['%%%s%%' % name_filter]
)
查询有效!耶!
答案 0 :(得分:2)
您可以使用extra执行此操作。
查询 postgres :
# || is string concatenation in postgres
# query = "Betty B"
queryset_list = Person.objects.extra(
where=['first_name || ' ' || last_name ilike %s']
params=['%%%s%%' % query]
)
结果查询类似于:
SELECT * FROM appname_person WHERE first_name ||' '|| last_name ilike 'Betty B';
对于 MySql ,此查询应该有效:
# concat using for string concatenation in Mysql;
queryset_list = Person.objects.extra(
where=['lower(concat(first_name," ",last_name)) like %s']
params=['%%%s%%' % query]
)