CHỈNH SỬA:Django 1.8 giúp tra cứu nội dung postgresql không nhạy trọng âm. https://docs.djangoproject. com / en / dev / ref / Contrib / postgres / lookups / # std:fieldlookup-unaccent
Trên thực tế, trong postgres Contrib (8.4+), có một chức năng đơn giản để tìm kiếm dễ dàng:
cho postgres 9 / 8.5:
- https://github.com/adunstan/postgresql- dev / commit / master / Contrib / unaccent
- http://www.sai.msu.su/~megera/ wiki / unaccent
cho postgres 8.4:
đây là một ví dụ về cách sử dụng từ django:
vals = MyObject.objects.raw(
"SELECT * \
FROM myapp_myobject \
WHERE unaccent(name) LIKE \'%"+search_text+"%'")
Bạn có thể áp dụng áp dụng không công tâm trên tìm kiếm văn bản trước khi so sánh.
Tùy chọn tôi đã thực hiện là:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# parts of credits comes to clarisys.fr
from django.db.backends.postgresql_psycopg2.base import *
class DatabaseOperations(DatabaseOperations):
def lookup_cast(self, lookup_type):
if lookup_type in('icontains', 'istartswith'):
return "UPPER(unaccent(%s::text))"
else:
return super(DatabaseOperations, self).lookup_cast(lookup_type)
class DatabaseWrapper(DatabaseWrapper):
def __init__(self, *args, **kwargs):
super(DatabaseWrapper, self).__init__(*args, **kwargs)
self.operators['icontains'] = 'LIKE UPPER(unaccent(%s))'
self.operators['istartswith'] = 'LIKE UPPER(unaccent(%s))'
self.ops = DatabaseOperations(self)
Sử dụng tệp này base.py
trong một thư mục và sử dụng thư mục này làm phụ trợ db. icontains và istartswith hiện không phân biệt chữ hoa và chữ thường.