Рассмотрим следующую ситуацию: -
Предположим, что мое приложение позволяет пользователям создавать состояния/провинции в своих страна. Для ясности мы рассматриваем только символы ASCII здесь.
В США пользователь может создать состояние под названием "Техас" . Если это приложение используется внутри, скажем, пользователю все равно, "texas" или "Texas" или "teXas"
Но важно то, что система должна предотвратить создание "тексаса", если "Техас" уже находится в базе данных.
Если модель выглядит следующим образом:
class State(models.Model):
name = models.CharField(max_length=50, unique=True)
Уникальность была бы чувствительной к регистру в postgres; то есть postgres позволит пользователю создавать как "тексас", так и "Техас" , поскольку они считается уникальным.
Что можно сделать в этой ситуации, чтобы предотвратить такое поведение. Как сделать один идет о предоставлении case- insenstitive уникальности с Django и Postgres
Сейчас я делаю следующее, чтобы предотвратить создание case- нечувствительные дубликаты.
class CreateStateForm(forms.ModelForm):
def clean_name(self):
name = self.cleaned_data['name']
try:
State.objects.get(name__iexact=name)
except ObjectDoesNotExist:
return name
raise forms.ValidationError('State already exists.')
class Meta:
model = State
Есть несколько случаев, когда мне нужно будет сделать эту проверку, и я не хочу писать одинаковые проверки iexact.
Просто интересно, есть ли встроенный или лучший путь? Может быть, db_type поможет? Может быть, какое-то другое решение существует?