Django CharField gegen TextField

302

Was ist der Unterschied zwischen CharField()und TextField()in Django? Die Dokumentation besagt, dass CharField()dies für kleinere Zeichenfolgen und TextField()für größere Zeichenfolgen verwendet werden sollte. Okay, aber wo ist die Grenze zwischen "klein" und "groß" gezogen? Was ist hier unter der Haube los, was dies der Fall macht?

Jonathan Gleason
quelle

Antworten:

354

Es ist ein Unterschied zwischen RDBMS varchar(oder ähnlichen) - diese werden normalerweise mit einer maximalen Länge angegeben und sind möglicherweise in Bezug auf Leistung oder Speicher effizienter - und text(oder ähnlichen) Typen - diese sind normalerweise nur durch fest codierte Implementierungsgrenzen begrenzt (nicht a) DB-Schema).

In PostgreSQL 9 heißt es insbesondere: "Es gibt keinen Leistungsunterschied zwischen diesen drei Typen" , aber AFAIK gibt es einige Unterschiede, z. B. bei MySQL. Dies ist also zu beachten.

Eine gute Faustregel ist, dass Sie verwenden, CharFieldwenn Sie die maximale Länge TextFieldansonsten begrenzen müssen .

Dies ist auch nicht wirklich Django-spezifisch.

Cat Plus Plus
quelle
43
Und umgekehrt, wenn Sie CharField verwenden, müssen Sie eine maximale Länge haben
Sam Svenbjorgchristiensensen
17
Ich habe festgestellt, dass die TextFieldstandardmäßige Verwendung die Portabilität Ihrer App beeinträchtigen kann. Es gibt möglicherweise keinen Leistungseinbruch bei Postgres, aber Oracle speichert ihn als einen, CLOBder einige Probleme mit sich bringt, z. B. dass das Feld in WHERE-Anweisungen nicht verwendet werden kann. Nur etwas zu beachten.
Rob
3
Man sollte auch berücksichtigen, dass in Oracle CharFieldnicht max_lengthmehr als 2000 vorhanden sein kann oder ein ORA-00910: specified length too long for its datatypeFehler auftritt.
Dinei
Bei der Betrachtung von Feldattributen ist zu beachten, dass Postgres-Dokumente auch sagen (Hervorhebung von mir): "Die längste mögliche Zeichenfolge, die gespeichert werden kann, beträgt ca. 1 GB. (Der maximale Wert, der für n in der Datentypdeklaration zulässig ist, beträgt weniger als das [...] Wenn Sie lange Zeichenfolgen ohne bestimmte Obergrenze speichern
möchten
3
Ich glaube, der wirklich wichtige Unterschied zwischen den beiden in Django ist, wie eine Ansicht mit dem Feld umgehen wird. In einer generischen Bearbeitungsansicht wird das TextField als mehrzeilige Eingabe mit veränderbarer Größe gerendert. während das CharField ein einzeiliger Eingang ist. Ich habe mir die Django-Quelle für TextField nicht angesehen, aber ich gehe davon aus, dass, wenn generiertes HTML an ein TextField angehängt wird, höchstwahrscheinlich eine Möglichkeit implementiert wird, mehrzeiligen Text ordnungsgemäß zu bearbeiten.
Mitchell Walls
36

In einigen Fällen hängt es davon ab, wie das Feld verwendet wird. In einigen DB-Engines bestimmen die Feldunterschiede, wie (und ob) Sie nach Text im Feld suchen. CharFields werden normalerweise für durchsuchbare Objekte verwendet, z. B. wenn Sie in der Zeichenfolge "eins plus zwei" nach "eins" suchen möchten. Da die Zeichenfolgen kürzer sind, ist das Durchsuchen für die Engine weniger zeitaufwändig. TextFields sind normalerweise nicht zum Durchsuchen gedacht (wie vielleicht der Körper eines Blogs), sondern sollen große Textblöcke enthalten. Jetzt hängt das meiste davon von der DB Engine ab und wie bei Postgres spielt es keine Rolle.

Auch wenn es keine Rolle spielt, erhalten Sie bei Verwendung von ModelForms eine andere Art von Bearbeitungsfeld im Formular. Die ModelForm generiert ein HTML-Formular in der Größe einer Textzeile für ein CharField und eine mehrzeilige für ein TextField.

Renderbox
quelle
2
Dies ist bei weitem die beste Erklärung, da darin erwähnt wird, wie das Feld in einer Form erzeugt wird. Das Charfield ist nur eine einzeilige Eingabe, das TextField jedoch eine mehrzeilige Größe. TextField ist sinnvoll, wenn Sie hauptsächlich generische Klassenansichten implementieren. Es funktioniert hervorragend für ein Beschreibungsfeld oder ähnliches. Mir gefällt auch, wie Renderbox erwähnt hat, dass Sie es nicht für Filter / Suchen verwenden möchten.
Mitchell Walls
8

Zum Beispiel. In einem Modell wie unten werden 2 Felder hinzugefügt.

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

Unten finden Sie die MySQL-Abfragen, die ausgeführt werden, wenn Migrationen angewendet werden.


für TextField(Beschreibung) ist das Feld definiert alslongtext

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

Die maximale Länge von TextFieldMySQL beträgt laut GB -Typ-Übersicht 4 GB .


für CharField(title) ist die max_length (erforderlich) definiert alsvarchar(64)

ALTER TABLE `sometable_sometable` ADD COLUMN `title` varchar(64) NULL;
ALTER TABLE `sometable_sometable` ALTER COLUMN `title` DROP DEFAULT;
SuperNova
quelle
1
Nit: die Django docs empfehlen: Avoid using null on string-based fields such as CharField and TextField: docs.djangoproject.com/en/2.0/ref/models/fields/#null so ist es am besten zu halten null=False.
Modulitos
7

CharFieldhat max_length von 255Zeichen, TextFieldkann aber mehr als 255Zeichen enthalten. Verwenden TextFieldSie diese Option, wenn Sie eine große Zeichenfolge als Eingabe haben. Es ist gut zu wissen, dass der max_lengthParameter , wenn TextFielder an a übergeben wird, die Längenüberprüfung an das TextAreaWidget übergibt .

Njeru Cyrus
quelle
"Alle Felder, die mit VARCHARmax_length
Spaltentypen
-4

Ich hatte ein seltsames Problem und verstand einen unangenehmen seltsamen Unterschied: Wenn ich eine URL vom Benutzer als CharField erhalte und sie dann in HTML als Tag von href verwende, fügt sie diese URL meiner URL hinzu , und das ist nicht das, was ich will. Aber wenn ich es per Textfeld mache, übergibt es nur die URL, die der Benutzer eingegeben hat. Schauen Sie sich diese an: meine Website-Adresse:http://myweb.com

CharField entery: http://some-address.com

wenn Sie darauf klicken: http://myweb.comhttp://some-address.com

TextField entery: http://some-address.com

wenn Sie darauf klicken: http://some-address.com

Ich muss erwähnen, dass die URL in der Datenbank auf zwei Arten genau gleich gespeichert wird, aber ich weiß nicht, warum das Ergebnis beim Klicken unterschiedlich ist

amin_mirr
quelle