Django CharField vs TextField
Quelle est la différence entre CharField()
et TextField()
dans Django? Le la documentation dit que CharField()
doit être utilisé pour les petites chaînes et TextField()
devrait être utilisé pour les grandes chaînes. Ok, mais où est la ligne tracée entre "petits" et "gros"? Ce qui se passe sous le capot qui rend ce le cas?
Vous devez vous connecter pour publier un commentaire.
Il une différence entre du SGBDR
varchar
(ou similaire) — ceux-ci sont généralement spécifiés avec un maximum de longueur, et peut-être plus efficace en termes de performances ou de stockage — ettext
(ou similaire), les types de ceux qui sont habituellement seulement limité par codée en dur dans la mise en œuvre des limites (pas un DB schéma).PostgreSQL 9, concrètement, les états qui "Il n'y a pas de différence de performances entre ces trois types de", mais autant que je sache, 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
CharField
lorsque vous avez besoin de limiter la longueur maximale,TextField
autrement.Ce n'est pas vraiment Django spécifiques, aussi.
TextField
par défaut peut avoir un impact à la portabilité de votre application. Il n'y a pas de dégradation des performances sur Postgres, mais Oracle va le stocker en tant queCLOB
qui a quelques ennuis, comme n'étant pas en mesure d'utiliser le champ dans lesquels des énoncés. Juste quelque chose à considérer.CharField
ne pouvez pas avoirmax_length
supérieure à 2000, ou il émet unORA-00910: specified length too long for its datatype
erreur.Dans certains cas, elle est liée à la façon dont le champ est utilisé. Dans certains moteurs de base de données les différences de champ de déterminer comment (et si) vous recherchez du texte dans le champ. CharFields sont généralement utilisés pour des choses qui sont l'objet de recherches, comme si vous voulez la recherche pour "un" dans la chaîne "un plus deux". Depuis les cordes sont plus courts, ils sont de moins en moins de temps pour le moteur de recherche par le biais de. TextFields sont généralement pas destinés à être fouillé (comme peut-être le corps d'un blog), mais sont destinées à contenir de grandes portions de texte. Maintenant, cela dépend du Moteur DB et comme dans Postgres, il n'a pas d'importance.
Même si elle n'a pas d'importance, si vous utilisez ModelForms vous obtenez un type différent de l'édition de champ 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.
Pour eg.,. 2 champs sont ajoutés dans un modèle comme ci-dessous..
Ci-dessous sont les requêtes mysql exécutée lorsque les migrations sont appliquées.
pour
TextField
(description) le champ est défini comme unlongtext
La longueur maximale de
TextField
de MySQL est de 4 go selon chaîne de type-vue d'ensemble.pour
CharField
(titre) de la max_length(obligatoire) est défini commevarchar(64)
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 gardernull=False
.CharField
a max_length de255
des personnages toutTextField
peut détenir plus de255
caractères. UtilisationTextField
quand vous avez une grande chaîne en entrée. Il est bon de savoir que lorsque lemax_length
paramètre est passé dans uneTextField
il passe à la longueur de la validation de laTextArea
widget.J'ai eu un problème étrange et compris désagréable étrange différence:
quand j'ai une URL à partir de l'utilisateur comme un CharField et puis, et de l'utiliser en html une balise href, il ajoute que l'url est l'adresse de ma page 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é.
regardez ces:
mon adresse de site web:
http://myweb.com
CharField entery:
http://some-address.com
en cliquant dessus:
http://myweb.comhttp://some-address.com
TextField entery:
http://some-address.com
en cliquant dessus:
http://some-address.com
Je dois mentionner que l'URL est enregistré exactement la même en DB par deux moyens mais je ne sais pas pourquoi le résultat est différent lorsque vous cliquez sur eux