2013-12-16 3 views
1

django의 표준 사용자 모델을 사용하고 있습니다.django의 여러 필드를 통한 키워드 검색

성함으로 사용자를 검색하고 싶습니다. 그래서 저는 자유 텍스트 검색을하고 아이콘을 사용하여 그 텍스트를 검색하고 있습니다.

그러나 나는 사용자가 "John A"를 검색하고 First Name + Last name에 "John A"가 포함 된 모든 사용자를 검색 할 수 있기를 원합니다. 작동하지 않습니다. "존"만이 일할 것이다. 하지만 두 필드를 모두 포함하는 한 이해가 안됩니다.

간단한 해결책 이겠지요?

+0

'John A'을'first_name = 'John''과'last_name = 'A''로 분열 시키려고하십니까? – karthikr

+0

예. 이것이 사용자 모델이 구현 된 방식입니다. first_name과 lat_name이 분리됩니다. 공백을 백엔드로 나눠 줄 것을 제안합니까? 두 분야 모두에서 더 많은 검색을 계획하고있었습니다. 검색 할 때 이름과 마지막 시간을 병합하는 등. 하지만 당신은 그 반대 일할 수있는 제안 : –

답변

1

Q 개체를 사용하여 검색어를 만들고 OR에 |, AND에 &을 사용합니다.

>>> from django.db.models import Q 
>>> qs = Q(first_name__icontains='John A') | Q(last_name__icontains='John A') 
>>> User.objects.filter(qs) 

here

그것에 대해 더 추신 읽기 여러 필드

편집 귀하의 코멘트 파 등

을 통해 갈 때 모든, 당신은 또한 일반 검색어 세트

User.objects.filter(...) | User.objects.filter(...) 

가입 |&을 사용할 수 있지만 나는 Q 개체를 사용하는 것은 단지 깔끔한 생각 당신이 원하는 것은 다음과 같습니다 :

>>> query = 'John A' 
>>> fn, ln = query.split() 
>>> User.objects.filter(first_name=fn, last_name=ln) 

복잡한 상황의 경우 이름과 성을 확인하는 것이 좋습니다. 두 번째 것은 일반적으로 다른 이름의 중간 이름이거나 일부이므로, 그것을 유지할 것입니다. 이렇게 뭔가 :

매우 예쁘지는 않지만 성이 먼저 입력 된 곳을 포함하여 대부분의 경우에 잘 작동합니다. 그냥 당신이 내가 당신의 프로젝트에 맹목적으로 복사 여기가 아니라 무슨 짓을했는지 알고 있어야합니다 -

  • 내가 문자열의 처음과 마지막 부분을 가져다가 내가 검색어 세트를 만들
  • 을 fn을 각각 에선 그들에게 할당 firtcase
  • 을 위해 그때 |
  • 마지막으로 사용 반대 옵션에 대해 다른 검색어 세트에 합류, 그의 검색어에 필터링 가능한 중복 제거하는 별개의 사용

아마 많은 로직을 추가 할 수 있습니다. 예를 들어, 'John A'- 성은 분명히 약어이며 전체 이름이 아니고 첫 번째 이름은 전체 이름입니다. 이를 처리하고 그에 따라 쿼리 세트를 구현하는 로직을 구현할 수 있습니다 (은 startswith 또는 그 다음 간단한 비교입니다). Q 개체를 사용하면 쉽게 사용할 수 있습니다. 그걸로 놀아, 당신은 그것의 교수형을 얻을거야

+0

그 실 거예요 ... first_name과 last_name의 아무도 "존 A"가 포함되어 있습니다 ... first_name은 "존"을 포함하고 last_name은 "A"가 내 문제입니다 ... –

+0

Ok , 그래서 당신은 훨씬 더 단순한 것을 원한다. 편집 – yuvi

+0

을 참조하십시오. 의견 중 하나에서 제안을 받았습니다. 나는 "존 밴 멘드리크"와 같은 이름에 대해 걱정하고 있습니다. 누군가가 "John A"또는 "A John"이라고 쓰면 –

-1

나는 natural_key를 사용하는 것이 좋습니다.

def natural_key(self): 
     return (self.first_name, self.last_name) 

결과 :

users = User.objects.filter() 
for user in users: 
    print(user.natural_key) 

그런 다음 자연 키를 필터링 할 수 있습니다 귀하의 사용자 모델에서 뭔가를 추가 할 수 있습니다.

희망이 있습니다.

+0

자연 키를 사용하여 필터링하려면 어떻게해야합니까? User.objects.filters (natural_key__icontains == keywords)? 난 그게 작동하지 않을 것 같아 ... –

+0

자연스러운 키가 필터에 데이터베이스에 존재하지 않는 사용자 모델의 메소드가 될 것이므로 분명히 투표 중이므로 질문에 명확하게 답변하지 않고 작동하지 않을 것입니다. – user2734679