У меня есть поле, которое имеет 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 и затем усечение? Это кажется неэлегантным и должен быть лучший путь.
Вы можете создать настраиваемое поле, которое автоматически обрезает поле (я думаю, этот код должен работать, но перепроверьте его):
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
подготавливает значение для поля для вставки в базу данных, так что это идеальное место для усечения.
Почему бы вам не использовать ModelForm
. ModelForm принудительно выполняет проверку, устанавливая max_length по умолчанию для свойства max_length поля модели и вызывая соответствующую ошибку проверки при вызове form.is_valid ()
. Таким образом, вам не нужно сохранять форму, пока форма не будет проверена.
Или, если вы хотите незаметно пройти проверку и усечь, что вам больше всего подходит, напишите простую форму django и напишите чистый метод, который усекает входную строку до max_length и возвращает очищенные данные. После проверки формы возьмите данные из form.cleaned_data
и сохраните объект.
С учетом всего этого, формы предназначены для проверки данных перед переходом в БД.
Почему бы вам не использовать TextField? Из руководства:
Для больших объемов текста используйте Текстовое поле.
Это кажется неэлегантным, и должен быть способ получше.
Единственная причина, по которой когда-либо происходит усечение, заключается в том, что MySQL не соответствует стандарту SQL. Вызов исключения - это правильный ответ при попытке ВСТАВИТЬ строку в поле VARCHAR, которое недостаточно широкое, чтобы вместить его. Вместо этого MySQL усекает и вставляет.
Если вы хотите незаметно повредить свои данные, вам придется как-то сделать это вручную - PostgreSQL никогда не сделает этого за вас.