django admin에서 search_fields에 대해 간단하게 알아보겠습니다. 저는 db를 sqlite를 사용하였습니다.

 


 search_fields는 search box를 enable 시키게 되는데요. 7번째 줄에 보면 "content"가 적혀있습니다. 이는, "content"에 대해 무언가를 검색하는 검색창을 활성화 시킵니다. 앞에 =이라던지 ^가 붙지 않았기 때문에 icontains 옵션으로 동작하게 됩니다.

 

 chokw를 검색해 보겠습니다. 그랬더니, chokw가 포함된 포스트가 검색됩니다. 중요한 것은 content가 "chokw"였던 것 뿐만이 아니라, "my name is chokw"인 것도 같이 결과에 나왔다는 것입니다.

 

 

 "is"를 검색해 봅시다. 그러면 "my name is chokw"인 것만 검색이 되는데요. 이는, content에 "is"가 포함되었기 때문입니다. 사실 정확하게는, icontains 조건이 걸리는데요. 대소문자 구분없이 포함되는 것을 검색합니다. 예를 들어, "My"를 검색해도, "my name is chokw" 라는 포스트가 검색 결과에 나타납니다.

 


 앞에 =가 붙으면 어떻게 될까요? 이 때에는 exactly입니다. 정확하게 일치하는 것만 검색합니다.

 

 

 chokw를 검색해 봅시다. 그러면 아까와는 다르게 "chokw"인 것만 검색이 됨을 알 수 있습니다. 문서에 따르면 iexact로 검색한다고 하는데요. 대소문자 구분없이 검색합니다. 고로, cHoKw라고 입력한 포스트도 검색이 될 겁니다.

 

 

 고로, chokw라고 쓴 포스트를 "cHoKw"로 바꿔도 검색이 됩니다. 다시 해당 포스트의 content를 "chokw"로 바꿉시다.

 


 앞에 ^가 붙으면 startswith가 걸립니다.

 

 

 예를 들어, 이 경우, content가 m으로 시작하는 것이 모두 걸립니다. "my name is cho" 라는 포스트만 보이네요.

 


 이제 작성자가 chokw인 것만 검색해 보겠습니다. 유저 이름은 대문자가 나오지 않는다고 가정합시다. 일단, user는 외래키로 걸려있습니다. django.contrib.auth.models의 User를 참조하고 있는데요.

 

 

 이 User 안에 있는 필드에 username이 있습니다. 고로, __를 이용해서 접근해야 합니다. 고로, 유저 이름이 정확히 ???인 것을 검색하기 위해서는 =user__username을 입력하면 됩니다.

 

 

 전체 포스트는 위와 같습니다.

 

 chokw1을 검색하면 정확하게 포스트를 작성한 유저 이름이 chokw1인 것만 검색됩니다.

 

 


 search_field에 여러 개의 조건이 오는 경우에는 어떨까요? 이 경우, 조건들은 OR로 연결됩니다. 무슨 소리일까요?

 

 7번째 줄을 보면 search_field에 =user__username과 =content가 있습니다. 이 두 조건이 OR로 연결이 된답니다. 그러면 작성자의 이름이 ??? 이거나, content가 정확히 ???인 것을 찾는다는 의미입니다.

 

 

 전체 포스트는 위와 같습니다. "chokw"라고 써진 포스트를, "chokw1"로 변경하였습니다.

 

 

 chokw1을 검색창에 입력하고 검색하니, 2개의 포스트가 나왔습니다. 하나는 user의 이름이 정확히 chokw1이였습니다. 조건 1을 만족했습니다. 다른 하나는 content가 정확히 "chokw1"이였습니다. 조건 2에 만족했기 때문에, 두 포스트가 나온 것입니다. 다른 하나는, 작성자가 "chokw"여서 조건 1도 만족하지 않습니다. 그리고, content 역시 "my name" 으로 시작해서 정확히 "chokw1"이 아니였습니다. 조건 1과 2 모두 만족하지 않았기 때문에, 결과에 나타나지 않습니다.