如何在Django模型中搜索多个字段

时间:2013-12-18 18:06:59

标签: django django-queryset

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]
            )

查询有效!耶!

1 个答案:

答案 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]
)