Джанго Чарфилд против TextField - PullRequest
262 голосов
/ 09 сентября 2011

В чем разница между CharField() и TextField() в Джанго? Документация гласит, что CharField() следует использовать для небольших строк и TextField() следует использовать для больших строк. Хорошо, но где проходит граница между «маленьким» и «большим»? Что здесь происходит под капотом, что делает это дело?

Ответы [ 5 ]

297 голосов
/ 09 сентября 2011

Это разница между varchar (или аналогичными) СУБД - они обычно указываются с максимальной длиной и могут быть более эффективными с точки зрения производительности или хранения - и text (или аналогичными) типами - обычно этоограничено только жестко заданными пределами реализации (не схемой БД).

PostgreSQL 9, в частности, заявляет, что «Между этими тремя типами нет разницы в производительности» , но AFAIK есть некоторые различияНапример, в MySQL, об этом следует помнить.

Хорошее практическое правило заключается в том, что вы используете CharField, когда вам нужно ограничить максимальную длину, TextField в противном случае.

Это также не относится к Джанго.

33 голосов
/ 02 января 2012

В некоторых случаях это связано с тем, как используется поле. В некоторых механизмах БД различия полей определяют, как (и если) вы ищите текст в поле. CharFields обычно используются для вещей, которые можно искать, например, если вы хотите найти «один» в строке «один плюс два». Поскольку строки короче, они занимают меньше времени для поиска движком. Текстовые поля обычно не предназначены для поиска (например, в теле блога), но предназначены для хранения больших кусков текста. Теперь большая часть этого зависит от механизма БД и, как и в Postgres, не имеет значения.

Даже если это не имеет значения, если вы используете ModelForms, вы получаете другой тип поля редактирования в форме. ModelForm сгенерирует HTML-форму размером в одну строку текста для CharField и многострочную для TextField.

7 голосов
/ 10 апреля 2017

Например,.В модели добавлено 2 поля, как показано ниже.

description = models.TextField(blank=True, null=True)
title = models.CharField(max_length=64, blank=True, null=True)

Ниже приведены запросы mysql, выполняемые при применении миграций.


для TextField (описание) полеопределяется как longtext

ALTER TABLE `sometable_sometable` ADD COLUMN `description` longtext NULL;

Максимальная длина TextField MySQL составляет 4 ГБ в соответствии с обзором типа строки .


дляCharField (название) max_length (обязательно) определяется как varchar(64)

ALTER TABLE `sometable_sometable` ADD COLUMN `title` varchar(64) NULL;
ALTER TABLE `sometable_sometable` ALTER COLUMN `title` DROP DEFAULT;
6 голосов
/ 10 марта 2018

CharField имеет максимальную длину 255 символов, в то время как TextField может содержать более 255 символов. Используйте TextField, когда у вас есть большая строка в качестве ввода. Полезно знать, что когда параметр max_length передается в TextField, он передает проверку длины в виджет TextArea.

0 голосов
/ 31 мая 2019

У меня была странная проблема, и я понял неприятную странную разницу: когда я получаю URL-адрес от пользователя как CharField , а затем и использую его в html теге по href, он добавляет этот URL к моему URL, а это не то, что я хочу. Но когда я делаю это с помощью Textfield , он пропускает только URL, который ввел пользователь. посмотри на эти: адрес моего сайта: http://myweb.com

CharField entery: http://some-address.com

при нажатии на нее: http://myweb.comhttp://some-address.com

TextField entery: http://some-address.com

при нажатии на нее: http://some-address.com

Я должен упомянуть, что URL сохраняется точно так же, как то же самое в БД, двумя способами, но я не знаю, почему результат отличается при нажатии на них

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