Автоусечение полей в max_length в Django CharFields

У меня есть поле, которое имеет a max_length набор. Когда я сохраняю образцовый экземпляр, и значение поля больше, чем max_length, Django осуществляет это max_length на уровне базы данных. (См. документы Django о моделях: http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.CharField.max_length)

Однако, так как я использую Пост-ГРЭС, я получаю a DatabaseError исключение как это:

DatabaseError: value too long for type character varying(1000)

Я предпочел бы вместо этого автоусекать значение (таким образом, у меня нет исключения). Теперь, я могу сделать это вручную, но что я действительно хотел бы, должен иметь все мои модели, автоусеченные значение. (Не обязательно разумно. Просто отключение его в 999-м символе прекрасно.)

Если я просто пишу пользовательский класс, который импортирует из моделей. Модель и переопределение сохранение () метод, цикличное выполнение через каждый _meta.field, проверяющий на max_length и затем усечение? Это кажется неэлегантным и должен быть лучший путь.

30
задан Samuel Clay 11 August 2010 в 15:10
поделиться

4 ответа

Вы можете создать настраиваемое поле, которое автоматически обрезает поле (я думаю, этот код должен работать, но перепроверьте его):

class TruncatingCharField(models.CharField):
    def get_prep_value(self, value):
        value = super(TruncatingCharField,self).get_prep_value(value)
        if value:
            return value[:self.max_length]
        return value

Затем вместо использования models.CharField в вашем файле models.py , вы должны вместо этого просто использовать TruncatingCharField.

get_prep_value подготавливает значение для поля для вставки в базу данных, так что это идеальное место для усечения.

38
ответ дан 28 November 2019 в 00:08
поделиться

Почему бы вам не использовать ModelForm . ModelForm принудительно выполняет проверку, устанавливая max_length по умолчанию для свойства max_length поля модели и вызывая соответствующую ошибку проверки при вызове form.is_valid () . Таким образом, вам не нужно сохранять форму, пока форма не будет проверена.

Или, если вы хотите незаметно пройти проверку и усечь, что вам больше всего подходит, напишите простую форму django и напишите чистый метод, который усекает входную строку до max_length и возвращает очищенные данные. После проверки формы возьмите данные из form.cleaned_data и сохраните объект.

С учетом всего этого, формы предназначены для проверки данных перед переходом в БД.

3
ответ дан 28 November 2019 в 00:08
поделиться

Почему бы вам не использовать TextField? Из руководства:

Для больших объемов текста используйте Текстовое поле.

5
ответ дан 28 November 2019 в 00:08
поделиться

Это кажется неэлегантным, и должен быть способ получше.

Единственная причина, по которой когда-либо происходит усечение, заключается в том, что MySQL не соответствует стандарту SQL. Вызов исключения - это правильный ответ при попытке ВСТАВИТЬ строку в поле VARCHAR, которое недостаточно широкое, чтобы вместить его. Вместо этого MySQL усекает и вставляет.

Если вы хотите незаметно повредить свои данные, вам придется как-то сделать это вручную - PostgreSQL никогда не сделает этого за вас.

-3
ответ дан 28 November 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: