web-dev-qa-db-fra.com

Django CharField vs TextField

Quelle est la différence entre CharField() et TextField() dans Django? La documentation indique que CharField() doit être utilisé pour les chaînes plus petites et que TextField() doit être utilisé pour les chaînes plus grandes. D'accord, mais où est la ligne de démarcation entre "petit" et "grand"? Qu'est-ce qui se passe sous le capot ici qui en fait le cas?

264
Jonathan Gleason

C'est une différence entre le varchar (ou similaire) du SGBDR - ceux-ci sont généralement spécifiés avec une longueur maximale, et pourraient être plus efficaces en termes de performances ou de stockage - et les types text (ou similaires) - généralement limité uniquement par des limites d'implémentation codées en dur (pas un schéma de base de données).

PostgreSQL 9, en particulier, indique que "Il n'y a pas de différence de performance entre ces trois types" , mais, autant que je sache, il existe certaines différences dans, par exemple. MySQL, c'est donc quelque chose à garder à l'esprit.

En règle générale, vous utilisez CharField lorsque vous devez limiter la longueur maximale, TextField sinon.

Ce n'est pas vraiment spécifique à Django, aussi.

301
Cat Plus Plus

Dans certains cas, cela dépend de la manière dont le champ est utilisé. Dans certains moteurs de base de données, les différences de champ déterminent comment (et si) vous recherchez du texte dans le champ. Les champs CharField sont généralement utilisés pour les recherches, comme si vous souhaitez rechercher "un" dans la chaîne "un plus deux". Comme les chaînes sont plus courtes, le moteur consomme moins de temps. Les TextFields ne sont généralement pas destinés à être recherchés (comme peut-être le corps d'un blog), mais sont destinés à contenir de gros morceaux de texte. Maintenant, cela dépend en grande partie du moteur de base de données et, comme dans Postgres, peu importe.

Même si cela n'a pas d'importance, si vous utilisez ModelForms, vous obtenez un type de champ d'édition différent dans le formulaire. ModelForm générera un formulaire HTML de la taille d'une ligne de texte pour un CharField et d'un multiligne pour un TextField.

33
renderbox

Pour, par exemple. 2 champs sont ajoutés dans un modèle comme ci-dessous.

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

Vous trouverez ci-dessous les requêtes mysql exécutées lors de l’application des migrations.


pour TextField (description), le champ est défini comme un longtext

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

La longueur maximale de TextField de MySQL est de 4 Go selon string-type-overview .


pour CharField (titre), la longueur maximale (obligatoire) est définie comme varchar(64)

ALTER TABLE `sometable_sometable` ADD COLUMN `title` varchar(64) NULL;
ALTER TABLE `sometable_sometable` ALTER COLUMN `title` DROP DEFAULT;
7
SuperNova

CharField a une longueur maximale de 255 caractères, tandis que TextField peut contenir plus de 255 caractères. Utilisez TextField lorsque vous avez une grande chaîne en entrée. Il est bon de savoir que lorsque le paramètre max_length est transmis à une variable TextField, il transmet la validation de la longueur au widget TextArea.

6
Njeru Cyrus