Nano Hash - криптовалюты, майнинг, программирование

Проверка уникальности поля модели в нижнем регистре

Мне нужно было проверить уникальность поля модели в нижнем регистре, но без фактического сохранения поля модели в нижнем регистре; например если кто-то уже взял имя пользователя «Дэвид», то имя пользователя «Дэвид» будет недоступно. Я пробовал разные вещи и в итоге сделал следующее:

def _perform_unique_checks(self, unique_checks):
    errors = {}

    for model_class, unique_check in unique_checks:

        lookup_kwargs = {}
        for field_name in unique_check:
            f = self._meta.get_field(field_name)
            lookup_value = getattr(self, f.attname)
            if lookup_value is None:
                continue
            if f.primary_key and not self._state.adding:
                continue
            lookup_kwargs[str(field_name)] = lookup_value

        if len(unique_check) != len(lookup_kwargs):
            continue

        if 'username' in lookup_kwargs:
            lookup_kwargs['username'] = lookup_kwargs['username'].lower()

        qs = model_class._default_manager.filter(**lookup_kwargs)

        model_class_pk = self._get_pk_val(model_class._meta)
        if not self._state.adding and model_class_pk is not None:
            qs = qs.exclude(pk=model_class_pk)
        if qs.exists():
            if len(unique_check) == 1:
                key = unique_check[0]
            else:
                key = NON_FIELD_ERRORS
            errors.setdefault(key, []).append(
                self.unique_error_message(model_class, unique_check))

... который работает, но мне кажется немного запутанным. Мне было интересно, есть ли более лаконичный способ добиться этого?

03.07.2015

Ответы:


1

Вы пробовали фильтровать field_name__iexact, чтобы сделать соответствие без учета регистра?

Фильтры iregex, icontains и iexact должны уметь делать то, что вам нужно.

03.07.2015

2

Во-первых, вы можете использовать clean для этой функции (срабатывает при попытке проверки формы):

def clean__field_name(self):

Кроме того, вы можете добавить ограничение unique=True к рассматриваемому полю. Затем выполните Try/Except во время сохранения, чтобы поймать любой IntegrityError, который скажет вам, что поле не уникально. База данных и модель должны делать эту работу за вас, а не пытаться кодировать ее.

Также см. нечувствительные к регистру уникальные поля модели в Django?

С более подробной информацией (тип базы данных, копия модели, вы используете форму?), я могу расширить этот ответ.

03.07.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..