2010-06-02 35 views
7

Tôi đang sử dụng bộ lọc icontains để tìm kiếm các từ nhưng tôi chỉ muốn nó khớp với toàn bộ từ. ví dụ. nếu tôi tìm kiếm gan, tôi sẽ không muốn nó trở lại giao hàng.Bộ lọc iango phù hợp với toàn bộ từ chỉ

truy vấn của tôi trông như thế này

MyModel.objects.filter(title__icontains=search_word) 

Tôi đã thấy bộ lọc __search nhưng điều này không mang lại kết quả với 3 ký tự trở xuống và các trang web Tôi tòa nhà chứa rất nhiều những điều này có thể được tìm kiếm , ví dụ 'bbc'

Tôi không có quyền truy cập vào db nhưng nếu có ai biết cách tôi có thể tắt tính năng này trong mã thì tôi sẽ vui lòng chuyển sang sử dụng phương thức này làm phương án thay thế.

+1

Có lẽ bạn có thể sử dụng [regex] (http://docs.djangoproject.com/en/dev/ref/models/querysets/#iregex) để thay thế hoặc thêm dấu cách ở đầu và cuối của chuỗi 'search_word'? –

+0

Tôi đã suy nghĩ về việc thêm dấu cách nhưng nếu tiêu đề chỉ là 1 từ hoặc từ xuất hiện ở đầu hoặc cuối tiêu đề thì điều này sẽ không hoạt động. Làm thế nào tôi sẽ làm điều đó thông qua regex? – John

Trả lời

6

biểu thức chính quy thường đủ: http://docs.djangoproject.com/en/dev/ref/models/querysets/#regex

Xin lưu ý rằng cú pháp biểu thức chính quy là của backend cơ sở dữ liệu được sử dụng.

Trong python (sqlite) các regexp sẽ là:

\b(word)\b 

Trong Mysql bạn có:

mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; -> 1 
mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]'; -> 0 
+1

điều này cùng với http://docs.djangoproject.com/en/dev/ref/models/querysets/#iregex giải quyết được sự cố của tôi – John

-3

Có vẻ như bạn muốn khớp chính xác không phân biệt chữ hoa chữ thường.

MyModel.objects.filter(title__iexact=search_word) 

http://docs.djangoproject.com/en/dev/ref/models/querysets/#lookup-iexact

+0

điều này sẽ không hoạt động vì tôi vẫn muốn tìm kiếm một phần của chuỗi nhưng iexact yêu cầu toàn bộ chuỗi phải khớp. ví dụ: nếu tiêu đề của tôi là 'đây là tựa đề thử nghiệm', tôi sẽ muốn tìm điều này nếu tôi tìm kiếm 'tiêu đề thử nghiệm' – John

+0

Tôi hiểu. Bạn muốn nó tìm thấy 'tiêu đề thử nghiệm' nhưng không phải là 'tựa đề'. Hiểu rồi. –

+0

vâng đúng vậy. – John

0

Trong trường hợp bạn đã phục vụ và REST thực hiện với hoặc DRF, bạn có thể lọc cho toàn bộ các từ là $http.get(uri, {'params': {'display_name__iregex': '[[:<:]]word[[:>:]]'})

tất nhiên, display_name phải được bật để lọc trong Tastypie resour lớp Meta của ce là filtering = {'display_name': ALL,}

Các vấn đề liên quan