Джанго Чарфилд против TextField

Теги:
database
storage

4 ответа

251
Лучший ответ

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

PostgreSQL 9, в частности, гласит, что "Различия в производительности между этими тремя типами нет" , но AFAIK имеет некоторые отличия, например. MySQL, поэтому это нужно помнить.

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

Это тоже не специфично для Django.

  • 35
    И наоборот, если вы используете CharField, то вы должны иметь максимальную длину
  • 12
    Я обнаружил, что использование TextField по умолчанию может повлиять на переносимость вашего приложения. Возможно, производительность Postgres не снизится, но Oracle будет хранить ее как CLOB что вызывает некоторые неудобства, например, невозможность использовать это поле в операторах WHERE. Просто кое-что рассмотреть.
Показать ещё 3 комментария
28

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

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

  • 0
    Это, безусловно, лучшее объяснение, потому что оно упоминает, как оно генерирует поле в форме. Charfield будет просто однострочным вводом, а TextField будет многострочным с изменяемым размером. TextField имеет смысл, когда вы в первую очередь реализуете общие представления классов. Это прекрасно работает для поля описания или тому подобное. Мне также нравится, как renderbox упоминал, что вы не захотите использовать его для каких-либо фильтров / поисков.
7

Например, 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 (title) max_length (обязательно) определяется как varchar(64)

ALTER TABLE 'sometable_sometable' ADD COLUMN 'title' varchar(64) NULL;
ALTER TABLE 'sometable_sometable' ALTER COLUMN 'title' DROP DEFAULT;
  • 0
    nit: документация Django рекомендует: Avoid using null on string-based fields such as CharField and TextField : docs.djangoproject.com/en/2.0/ref/models/fields/#null, поэтому лучше оставить null=False .
5

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню