как сделать модели нечувствительными к регистру - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть модель.

класс Экзамен (models.Model): Examname = models.CharField (null = False, пусто = False, max_length = 255)

def save(self, *args, **kwargs):
    self.Examname = self.Examname.lower()
    return super(Exam, self).save(*args, **kwargs)

class Meta:
    unique_together = ["Examname"]    

def __str__(self):
    return self.Examname

Имя экзамена должно быть без учета регистра, чтобы избежатьдубликаты данных. Я преобразовал все в маленькие буквы и сохранил. Но это не обнаружение дублирующих данных. например, если я вставляю External как Examname, оно сохраняется как внешнее, но другое имя, если я даю как external, только оно обнаруживает как дублирующие данные. Внешняя или внешняя или любая, по крайней мере, одна заглавная буква находится там, она не обнаруживается как дублирующиеся данные, а хранится в виде маленьких букв

1 Ответ

0 голосов
/ 07 ноября 2019

Прежде всего, если regno должен хранить цифры и символы, не используйте FloatField, например, CharField

Если вы хотите избежать проблем с чувствительностью к регистру, вы можете, например,При сохранении объекта решите всегда сохранять значения в нижнем регистре следующим образом:

    def save(self, *args, **kwargs):
        self.regno = self.regno.lower()
        super(Show, self).save(*args, **kwargs)

Если вам нужно сохранить регистр, альтернативным вариантом будет дублирование строчного содержимого во вторичном CharField. Который может быть автоматизирован в методе сохранения.

Если вы попытаетесь вставить повторяющееся значение, django выдаст IntegrityError, который должен быть обработан.

class MyModel(models.Model):
    mytextfield = models.CharField()
    lowcase_textfield = models.CharField(unique=True)

    def save(self, *args, **kwargs):
        self.lowcase_textfield = self.mytextfield.lower()
        try:
            super(MyModel, self).save(*args, **kwargs)
        except IntegrityError as e:
            # INSERT YOUR EXCEPTION HANDLING HERE
            pass
...