Django. Перевод значений в верхний регистр при создании объекта модели
У меня есть модель, которая хранит в себе полное и краткое название криптомонеты. Название монет - это уникальное значение, которое не может повторятся. Однако когда я зашёл в админ-панель и попытался создать монету, я заметил, что могу создать две одинаковых монеты: btc и BTC.
Я понимаю, что для django - это разные названия из-за регистра, поэтому она допускает их создание. Хотелось бы узнать, как можно решить эту проблему.
Я пытался решить эту проблему на моменте описания полей модели. Я создал класс, который наследуется от CharField, но я не понимаю, где мне надо менять регистр.
Также я попытался изменить метод save, но при добавлении похожей записи django выкидывает исключение IntegrityError, хотя без переопределения этого метода, в интерфейсе админ-панели появлялось сообщение "Это название уже есть".
models.py:
class CryptoCoin(models.Model):
full_name = models.CharField(max_length=32, unique=True)
short_name = models.CharField(max_length=5, unique=True)
def __str__(self) -> str:
return self.short_name
Можно переопределить метод save таким образом:
class CryptoCoin(models.Model):
full_name = models.CharField(max_length=32, unique=True)
short_name = models.CharField(max_length=5, unique=True)
def save(self, *args, **kwargs):
self.short_name = self.short_name.upper()
return super(CryptoCoin, self).save(*args, **kwargs)
Так же, как вариант, можно попробовать переопределить field модели:
class UpperField(models.CharField):
def __init__(self, *args, **kwargs):
super(UpperField, self).__init__(*args, **kwargs)
def get_prep_value(self, value):
return str(value).upper()
class CryptoCoin(models.Model):
full_name = models.CharField(max_length=32, unique=True)
short_name = UpperField(max_length=5, unique=True)