Автоматическое усечение полей max_length в Django CharFields - PullRequest
28 голосов
/ 11 августа 2010

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

Однако, так как я использую Postgres, я получаю исключение DatabaseError, например:

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

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

Должен ли я просто написать собственный класс, который импортирует из models.Model и переопределяет метод save (), просматривая каждое поле _meta.field, проверяя max_length, а затем обрезая? Это кажется не элегантным, и должен быть лучший способ.

Ответы [ 4 ]

37 голосов
/ 11 августа 2010

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

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 в вашем *Файл 1005 *, вместо этого вы бы просто использовали TruncatingCharField.

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

5 голосов
/ 11 августа 2010

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

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

3 голосов
/ 11 августа 2010

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

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

Принимая во внимание тот факт, что формы предназначены для проверки данных перед отправкой в ​​БД.

0 голосов
/ 11 августа 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...