how to have Accent-insensitive filter in django with postgres?

前端 未结 5 1865
挽巷
挽巷 2021-02-04 12:32

Hi I find that on postgres database, we can\'t configure default accent sensivity (on old mail exchanges).

Is there a way to have a _icontains also insensitive to specia

5条回答
  •  耶瑟儿~
    2021-02-04 12:44

    EDIT: Django 1.8 makes accent unsensitive lookup for postgresql builtin. https://docs.djangoproject.com/en/dev/ref/contrib/postgres/lookups/#std:fieldlookup-unaccent

    In fact in postgres contrib (8.4+) there is an unaccent function to search easily:

    for postgres 9/8.5:

    • https://github.com/adunstan/postgresql-dev/commits/master/contrib/unaccent
    • http://www.sai.msu.su/~megera/wiki/unaccent

    for postgres 8.4:

    • https://launchpad.net/postgresql-unaccent

    here an example of usage from django:

    vals = MyObject.objects.raw(
            "SELECT * \
             FROM myapp_myobject \
             WHERE unaccent(name) LIKE \'%"+search_text+"%'")
    

    You may apply apply unaccent on text-search before comparison.

    Option I made is:

    #!/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)
    

    Use this file base.py in a folder and use this folder as db backend. icontains and istartswith are now case and accent insensitive.

提交回复
热议问题