我有一个模型,我想过滤一个搜索词,通常是一个名字。但是,在我的数据库中,first_name
和last_name
是两个单独的字段。
e.g。
search_term = 'Will Sm'
db_persons
记录:first_name = 'Will', last_name = 'Smith'
搜索字词可以检索此记录。
我怎样才能做到这一点?
db_persons.objects.filter(__?__)
更新:
寻找一种连接字段并在没有原始SQL的情况下查询连接结果的方法
答案 0 :(得分:6)
如果您想搜索第一个姓氏,可以直接使用:
db_persons.objects.filter(first_name='Will', last_name='Smith')
如果要搜索first_name或last_name:
,请使用Q objectsfrom 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_name
和last_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(' ', ''))