Фильтр запросов Django (PostgreSQL) для исключения заданных букв - PullRequest
0 голосов
/ 30 мая 2019

Пользователь отправляет одно из писем из следующего алфавита, и я хочу отправить соответствующий ответ.

enter image description here

Как вы можете заметить, есть некоторая смесь кириллицы и латыни. У меня есть следующий get_queryset метод:

def get_queryset(self):
        SPECIAL_CHARACTERS = [
            'Аь', 'Гl', 'Кх', 'Къ', 'Кl', 'Оь', 'Хь', 'Хl', 'Цl', 'Чl', 'Юь', 'Яь'
        ]
        queryset = WordChechenModel.objects.all().order_by('word_chechen')
        first_letter = self.request.query_params.get('letter', None)
        if first_letter is not None:
            if len(first_letter) == 2:
                queryset = queryset.filter(
                    word_chechen__iregex=r"^w+%s" % first_letter)
            else:
                queryset = queryset.filter(Q(word_chechen__startswith=first_letter) | Q(
                    word_chechen__startswith=first_letter.upper())).exclude(
                    word_chechen__startswith__in=SPECIAL_CHARACTERS)
        return queryset

В случае, если пользователь отправляет запрос на двойное (смешанное) письмо, я могу отфильтровать его с помощью регулярных выражений, но если пользователь отправляет запрос, скажем, с Аь или некоторыми из SPECIAL_CHARACTERS символов, чем у меня проблемы.

В настоящее время я пытался исключить все слова, начинающиеся с одной из букв, определенных в SPECIAL_CHARACTERS, используя следующий запрос:

queryset = queryset.filter(Q(word_chechen__startswith=first_letter) | Q(
                        word_chechen__startswith=first_letter.upper())).exclude(
                        word_chechen__startswith__in=SPECIAL_CHARACTERS)
            return queryset

Но это дает мне следующую ошибку:

django.core.exceptions.FieldError: Unsupported lookup 'startswith' for CharField or join on the field not permitted, perhaps you meant s
tartswith or istartswith?

Буду очень признателен за идеи. Скорость обработки запроса важна. Поэтому было бы неплохо получить обзор моего кода одновременно.

1 Ответ

0 голосов
/ 30 мая 2019

Я решил эту проблему, используя regex, thx nigel222 для указания на это. Я нашел решение в этом посте https://stackoverflow.com/a/2667582/7986808
Мой рабочий код:

def get_queryset(self):
        SPECIAL_CHARACTERS = [
            'Аь', 'Гl', 'Кх', 'Къ', 'Кl', 'Оь', 'Хь', 'Хl', 'Цl', 'Чl', 'Юь', 'Яь'
        ]
        queryset = WordChechenModel.objects.all().order_by('word_chechen')
        first_letter = self.request.query_params.get('letter', None)
        if first_letter is not None:
            if len(first_letter) == 2:
                queryset = queryset.filter(
                    word_chechen__regex=r"^%s" % first_letter)
            else:
                queryset = queryset.filter(
                    word_chechen__regex=r"^%s" % first_letter).exclude(
                        word_chechen__regex=r'(^' + '|^'.join(SPECIAL_CHARACTERS) + ')')
        return queryset
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...