sql >> Databáze >  >> RDS >> PostgreSQL

jak mít filtr necitlivý na akcent v django s postgres?

EDIT:Django 1.8 umožňuje necitlivé vyhledávání zvýraznění pro vestavěný postgresql. https://docs.djangoproject. com/en/dev/ref/contrib/postgres/lookups/#std:fieldlookup-unaccent

Ve skutečnosti v postgres contrib (8.4+) je funkce bez přízvuku pro snadné vyhledávání:

pro postgres 9/8.5:

pro postgres 8.4:

zde příklad použití z django:

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

Před porovnáním můžete na textové vyhledávání použít zvýraznění.

Možnost, kterou jsem udělal, je:

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

Použijte tento soubor base.py ve složce a použít tuto složku jako backend db. icontains a istartswith nyní nerozlišují malá a velká písmena.



  1. mysql tinyint(1) vs tinyint(2) vs tinyint(3) vs tinyint(4)

  2. Počítadlo návštěvníků Laravel

  3. Rychlý a nejlepší trik pro obnovu souborů SQL Server MDF

  4. Mohu použít příkaz \copy do funkce postgresql?