django queryset过滤问题

时间:2011-09-26 15:16:19

标签: django django-models

我有一个模型,我想过滤一个搜索词,通常是一个名字。但是,在我的数据库中,first_namelast_name是两个单独的字段。

e.g。

search_term = 'Will Sm'

db_persons记录:first_name = 'Will', last_name = 'Smith'

搜索字词可以检索此记录。

我怎样才能做到这一点?

db_persons.objects.filter(__?__)

更新:

寻找一种连接字段并在没有原始SQL的情况下查询连接结果的方法

2 个答案:

答案 0 :(得分:6)

如果您想搜索第一个姓氏,可以直接使用:

db_persons.objects.filter(first_name='Will', last_name='Smith')

如果要搜索first_name或last_name:

,请使用Q objects
from django.db.models.query_utils import Q
db_persons.objects.filter(Q(first_name='will') | Q(last_name='will'))

根据评论更新:一个简单的解决方案可能如下所示:

search_string = 'will smith'
query_list = search_string.split()
db_persons.objects.filter(Q(first_name__in=query_list) | Q(last_name__in=query_list))

如果您使用mysql,则可以使用search

答案 1 :(得分:2)

一个简单的解决方案是在模型上添加另一个字段complete_name。在save上,您将通过连接first_namelast_name字段来更新此字段,而不需要任何空格(您需要从连接结果中删除所有空格)。然后,您将使用search_term对此字段进行查询,但也会删除空格。

简单的例子给你一般的想法:

class Person(models.Model):
    first_name = CharField(...)
    last_name = CharField(...)
    complete_name = CharField(...)

    def save(self, *args, **kwargs):
        complete_name = '%s%s' % (self.first_name, self.last_name)
        self.complete_name = complete_name.replace(' ', '')
        super(Person, self).save(*args, **kwargs)

results = Person.objects.filter(complete_name__icontains=search_term.replace(' ', ''))