Django CharField vs TextField


302

Яка різниця між CharField()і TextField()в Джанго? У документації сказано, що CharField()слід використовувати для менших рядків і TextField()використовувати їх для великих рядків. Гаразд, але де проведена лінія між "малим" та "великим"? Що тут відбувається під капотом, що робить так?

Відповіді:


354

Це різниця між RDBMS varchar(або подібними) - вони, як правило, задаються з максимальною довжиною, і можуть бути більш ефективними щодо продуктивності чи зберігання - та text(або подібними) типами - вони, як правило, обмежені лише жорстко закодованими межами реалізації (не Схема БД).

PostgreSQL 9, зокрема, стверджує, що "Існує не різниця в продуктивності між цими трьома типами" , але в AFAIK є деякі відмінності, наприклад, в MySQL, так що це щось, що слід пам’ятати.

Хорошим правилом є те, що ви використовуєте, CharFieldколи вам потрібно обмежити максимальну довжину, TextFieldінакше.

Це насправді не специфічно для джанго.


43
І навпаки, якщо ви використовуєте CharField, то ви повинні мати максимальну довжину
Sam Svenbjorgchristiensensen

17
Я виявив, що використання TextFieldза замовчуванням може вплинути на портативність вашої програми. Можливо, не буде хіта на Postgres, але Oracle збереже це як те, CLOBщо має деякі роздратування, як, наприклад, неможливість використання поля в операторах WHERE. Просто щось врахувати.
Роб

3
Слід також врахувати, що в Oracle CharFieldне може бути max_lengthбільше 2000, або він видає ORA-00910: specified length too long for its datatypeпомилку.
Діней

Корисно зазначити, що при розгляді атрибутів поля, що документи Postgres також говорять (моє наголос): "найдовший можливий рядок символів, який можна зберегти, становить приблизно 1 Гб. (Максимальне значення, яке буде дозволено для n у декларації про тип даних, - менше, ніж [...] Якщо ви хочете зберігати довгі рядки без конкретної верхньої межі, використовуйте текст чи символ, що змінюються без специфікатора довжини, а не
складайте

3
Я вважаю, що насправді важливою відмінністю між ними в джанго є те, як вид буде обробляти поле. У загальному вигляді редагування TextField відображатиметься як багаторядковий повторно вхідний вхід; в той час як CharField - це вхід в один рядок. Я не переглянув джерело django для TextField, але я буду припускати, що будь-який згенерований HTML приєднаний до TextField, то він, швидше за все, реалізує спосіб правильного маніпулювання текстовим текстом.
Мітчелл Стіни

36

У деяких випадках вона пов'язана з тим, як використовується поле. У деяких двигунах БД різниці в полях визначають, як (і якщо) шукати текст у полі. CharFields зазвичай використовуються для речей, які можна шукати, наприклад, якщо ви хочете шукати "один" у рядку "один плюс два". Оскільки струни коротші, двигун займає менше часу для пошуку. Текстові поля, як правило, не призначені для пошуку (наприклад, частина блогу), але призначені для розміщення великих фрагментів тексту. Зараз велика частина цього залежить від Двигуна БД і, як у Postgres, це не має значення.

Навіть якщо це не має значення, якщо ви використовуєте ModelForms, ви отримуєте різний тип поля редагування у формі. ModelForm створить HTML-форму розміром з одного рядка тексту для CharField та багаторядкового для TextField.


2
Це, безумовно, найкраще пояснення, оскільки воно зазначає, як воно формує поле у ​​формі. Чарфілд буде просто вхідним рядком, але TextField буде змінною багаторядковою лінією. TextField має сенс, коли ви головним чином реалізуєте загальні представлення класів. Це чудово підходить для поля опису тощо. Мені також подобається, як renderbox згадав, що ви не хочете використовувати його для будь-яких фільтрів / пошукових запитів.
Мітчелл Стіни

8

Наприклад,. 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;

Максимальна довжина TextFieldMySQL - 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;

1
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.
modulitos

7

CharFieldмає максимальну довжину 255символів, але TextFieldможе містити більше 255символів. Використовуйте, TextFieldколи у вас є великий рядок в якості введення. Добре знати, що коли max_lengthпараметр передається в a, TextFieldвін передає перевірку довжини TextAreaвіджету.


"Будь-які поля, які зберігаються з VARCHARтипами стовпців, мають max_lengthобмеження до 255 символів, якщо ви використовуєте унікальний = True для поля. " (Мій наголос.)
l0b0,

-4

У мене виникла дивна проблема і зрозуміла неприємну дивну різницю: коли я отримую URL-адресу від користувача як CharField, а потім і використовую її в HTML тезі href, він додає цей URL до мого URL-адреси, і це не те, що я хочу. Але коли я роблю це за допомогою Textfield, він передає лише URL-адресу, яку ввів користувач. подивіться на це: адреса мого веб-сайту:http://myweb.com

Експертиза CharField: http://some-address.com

при натисканні на нього: http://myweb.comhttp://some-address.com

Текстове поле: http://some-address.com

при натисканні на нього: http://some-address.com

Я мушу зазначити, що URL-адреса зберігається точно однаково в БД двома способами, але я не знаю, чому результат відрізняється при натисканні на них

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.