349 votes

Django CharField vs TextField

Quelle est la différence entre CharField() y TextField() dans Django ? Le site documentation dit que CharField() doit être utilisé pour les petites chaînes et TextField() doit être utilisé pour les chaînes de caractères plus grandes. D'accord, mais où se situe la limite entre "petit" et "grand" ? Que se passe-t-il sous le capot pour que ce soit le cas ?

411voto

Cat Plus Plus Points 53385

Il s'agit d'une différence entre les SGBDR varchar (ou similaire) - ils sont généralement spécifiés avec une longueur maximale, et peuvent être plus efficaces en termes de performance ou de stockage - et text (ou similaires) - ceux-ci ne sont généralement limités que par des limites d'implémentation codées en dur (et non par un schéma de base de données).

PostgreSQL 9, en particulier, déclare que "Il n'y a pas de différence de performance entre ces trois types" mais il existe des différences dans MySQL, par exemple, et il faut donc en tenir compte.

Une bonne règle de base est que vous utilisez CharField lorsque vous devez limiter la longueur maximale, TextField autrement.

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

45 votes

Et inversement, si vous utilisez CharField alors vous debe ont une longueur maximale

18 votes

J'ai découvert qu'en utilisant TextField par défaut peut avoir un impact sur la portabilité de votre application. Il se peut qu'il n'y ait pas d'impact sur les performances de Postgres, mais Oracle le stockera en tant qu'un CLOB qui présente quelques inconvénients, comme l'impossibilité d'utiliser le champ dans les instructions WHERE. C'est juste un élément à prendre en compte.

5 votes

Il faut aussi considérer que dans Oracle CharField ne peut pas avoir max_length supérieur à 2000, ou bien il émet un ORA-00910: specified length too long for its datatype erreur.

39voto

renderbox Points 272

Dans certains cas, elle est liée à la façon dont le champ est utilisé. Dans certains moteurs de BD, les différences entre les champs déterminent comment (et si) vous recherchez du texte dans le champ. Les CharFields sont généralement utilisés pour les éléments qui peuvent faire l'objet d'une recherche, comme si vous vouliez rechercher "un" dans la chaîne "un plus deux". Comme les chaînes de caractères sont plus courtes, la recherche est moins longue pour le moteur. Les champs textuels ne sont généralement pas destinés à être consultés (comme le corps d'un blog), mais sont destinés à contenir de gros morceaux de texte. Maintenant, la plupart de ces éléments dépendent du moteur de base de données et, comme dans Postgres, ils n'ont pas d'importance.

Même si cela n'a pas d'importance, si vous utilisez ModelForms, vous obtenez un type différent de champ d'édition 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.

2 votes

C'est de loin la meilleure explication car elle mentionne comment elle génère le champ dans un formulaire. Le Charfield sera simplement une entrée d'une ligne, mais le TextField sera un champ multiligne redimensionnable. TextField a du sens lorsque vous implémentez principalement des vues de classes génériques. Il fonctionne très bien pour un champ de description ou autre. J'aime aussi la façon dont renderbox a mentionné que vous ne voudriez pas l'utiliser pour des filtres/sélections.

11voto

Trying2Learn Points 11

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)

Voici les requêtes mysql exécutées lorsque les migrations sont appliquées.


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

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

La longueur maximale des TextField de MySQL est de 4GB selon vue d'ensemble du type de chaîne .


pour CharField (titre) le max_length(requis) est défini comme suit varchar(64)

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

1 votes

Nit : les docs de Django recommandent : Avoid using null on string-based fields such as CharField and TextField : docs.djangoproject.com/fr/2.0/ref/models/fields/#null donc c'est mieux de garder null=False .

11voto

Njeru Cyrus Points 666

CharField a une longueur maximale de 255 caractères pendant 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 max_length est passé dans un TextField il transmet la validation de la longueur à l TextArea widget.

0 votes

"Tous les champs qui sont stockés avec VARCHAR Les types de colonnes ont leur max_length limité à 255 caractères si vous utilisez unique=True pour le champ. " (C'est moi qui souligne.)

1voto

Murad Points 61

Champ de texte peut contenir plus de 255 caractères, mais CharField a une longueur maximale de 255 caractères.

Lorsque vous voulez stocker un texte long, utilisez TextField, ou lorsque vous voulez spécifier la longueur maximale du texte, CharField est utile.

  article_title = models.CharField(max_length=150)
  article_body = models.TextField()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X