Django CharField vs TextField

302

Quelle est la différence entre CharField()et TextField()à Django? La documentation indique que cela CharField()devrait être utilisé pour les petites chaînes et TextField()devrait être utilisé pour les grandes chaînes. D'accord, mais où est la ligne tracée entre "petit" et "grand"? Que se passe-t-il sous le capot ici qui en fait le cas?

Jonathan Gleason
la source

Réponses:

354

C'est une différence entre les SGBDR varchar(ou similaires) - ceux-ci sont généralement spécifiés avec une longueur maximale et peuvent être plus efficaces en termes de performances ou de stockage - et les texttypes (ou similaires) - ceux-ci ne sont généralement limités que par des limites d'implémentation codées en dur (pas un Schéma DB).

PostgreSQL 9, en particulier, déclare qu ' "il n'y a pas de différence de performances entre ces trois types" , mais AFAIK il y a quelques différences, par exemple MySQL, donc c'est quelque chose à garder à l'esprit.

Une bonne règle de base est que vous utilisez CharFieldlorsque vous devez limiter la longueur maximale, TextFieldsinon.

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

Cat Plus Plus
la source
43
Et inversement, si vous utilisez CharField, vous devez avoir une longueur maximale
Sam Svenbjorgchristiensensen
17
J'ai constaté que l'utilisation TextFieldpar défaut peut avoir un impact sur la portabilité de votre application. Il se peut qu'il n'y ait pas de perte de performances sur Postgres, mais Oracle le stockera comme un CLOBqui présente des inconvénients, comme ne pas pouvoir utiliser le champ dans les instructions WHERE. Juste quelque chose à considérer.
Rob
3
Il faut également considérer que dans Oracle CharFieldne peut pas avoir max_lengthplus de 2000, ou il émet une ORA-00910: specified length too long for its datatypeerreur.
Dinei
Il est utile de noter, lors de l'examen des attributs de champ, que les documents Postgres disent également (soulignement le mien): "la chaîne de caractères la plus longue pouvant être stockée est d'environ 1 Go. (La valeur maximale qui sera autorisée pour n dans la déclaration de type de données est moins que cela [...] Si vous souhaitez stocker de longues chaînes sans limite supérieure spécifique, utilisez du texte ou des caractères variant sans spécificateur de longueur, plutôt que de créer une limite de longueur arbitraire .) "
iff_or
3
Je crois que la différence vraiment importante entre les deux dans django est la façon dont une vue va gérer le champ. Dans une vue d'édition générique, le TextField sera rendu comme une entrée redimensionnable sur plusieurs lignes; tandis que le CharField est une entrée à une seule ligne. Je n'ai pas regardé la source django pour TextField, mais je vais supposer que si du code HTML généré est attaché à un TextField, il implémentera très probablement un moyen de manipuler correctement le texte multiligne.
Mitchell Walls du
36

Dans certains cas, elle est liée à l'utilisation du champ. 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. CharFields est généralement utilisé pour les éléments pouvant être recherchés, comme si vous souhaitez rechercher "un" dans la chaîne "un plus deux". Comme les chaînes sont plus courtes, elles nécessitent moins de temps pour que le moteur recherche. Les TextFields ne sont généralement pas destinés à être parcourus (comme peut-être le corps d'un blog) mais sont destinés à contenir de gros morceaux de texte. Maintenant, la plupart de cela dépend du moteur DB et comme dans Postgres, cela n'a pas d'importance.

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. Le ModelForm va générer un formulaire HTML de la taille d'une ligne de texte pour un CharField et multiligne pour un TextField.

renderbox
la source
2
C'est de loin la meilleure explication car elle mentionne comment elle génère le champ dans un formulaire. Le Charfield ne sera qu'une entrée d'une ligne, mais le TextField sera une multiligne redimensionnable. TextField est logique lorsque vous implémentez principalement des vues de classe génériques. Cela fonctionne très bien pour un champ de description ou similaire. J'aime aussi la façon dont renderbox a mentionné que vous ne voudriez pas l'utiliser pour des filtres / recherches.
Mitchell Walls
8

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 lorsque des migrations sont appliquées.


pour TextField(description) le champ est défini commelongtext

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

La longueur maximale TextFieldde MySQL est de 4 Go selon l' aperçu des types de chaînes .


pour CharField(title), la longueur max_ (obligatoire) est définie commevarchar(64)

ALTER TABLE `sometable_sometable` ADD COLUMN `title` varchar(64) NULL;
ALTER TABLE `sometable_sometable` ALTER COLUMN `title` DROP DEFAULT;
SuperNova
la source
1
nit: les docs Django recommande: Avoid using null on string-based fields such as CharField and TextField: docs.djangoproject.com/en/2.0/ref/models/fields/#null il est donc préférable de garder null=False.
modulitos
7

CharFielda max_length de 255caractères alors qu'il TextFieldpeut contenir plus de 255caractères. À utiliser TextFieldlorsque vous avez une grande chaîne en entrée. Il est bon de savoir que lorsque le max_lengthparamètre est passé dans un, TextFieldil transmet la validation de la longueur au TextAreawidget.

Njeru Cyrus
la source
"Tous les champs qui sont stockés avec des VARCHARtypes de colonnes ont leur max_lengthrestriction à 255 caractères si vous utilisez unique = True pour le champ. " (C'est moi qui souligne.)
l0b0
-4

J'ai eu un problème étrange et j'ai compris une étrange différence désagréable: lorsque je reçois une URL de l'utilisateur en tant que CharField , puis que je l'utilise en html une balise par href, cela ajoute cette URL à mon URL et ce n'est pas ce que je veux. Mais quand je le fais par Textfield, il passe juste l'URL que l'utilisateur a entrée. regardez ces: mon adresse de site Web:http://myweb.com

Entrée CharField: http://some-address.com

en cliquant dessus: http://myweb.comhttp://some-address.com

Entrée TextField: http://some-address.com

en cliquant dessus: http://some-address.com

Je dois mentionner que l'URL est enregistrée exactement de la même manière dans DB, mais je ne sais pas pourquoi le résultat est différent lorsque vous cliquez dessus

amin_mirr
la source