2011-09-08 16 views
187

Qual è la differenza tra CharField() e TextField() in Django? Il documentation dice che CharField() dovrebbe essere usato per stringhe più piccole e TextField() dovrebbe essere usato per stringhe più grandi. Ok, ma dov'è la linea tracciata tra "piccolo" e "grande"? Cosa sta succedendo sotto la cappa qui che rende questo il caso?Django CharField vs TextField

risposta

214

È una differenza tra il numero varchar di RDBMS (o simile) - quelli di solito sono specificati con una lunghezza massima e potrebbero essere più efficienti in termini di prestazioni o memorizzazione - e tipi text (o simili). limiti di implementazione hardcoded (non uno schema DB).

PostgreSQL 9, in particolare, afferma che "There is no performance difference among these three types", ma AFAIK ci sono alcune differenze in es. MySQL, quindi questo è qualcosa da tenere a mente.

Una buona regola empirica è che si utilizza CharField quando è necessario limitare la lunghezza massima, TextField in caso contrario.

Questo non è proprio specifico per Django.

+24

E viceversa, se si utilizza CharField, è necessario * avere * una lunghezza massima –

+10

. Ho scoperto che l'utilizzo di 'TextField' per impostazione predefinita può influire sulla portabilità della tua app. Non ci può essere un impatto sulle prestazioni su Postgres, ma Oracle lo memorizzerà come un 'CLOB' che ha alcuni fastidi, come non essere in grado di utilizzare il campo nelle istruzioni WHERE. Solo qualcosa da considerare. – Rob

+1

Si dovrebbe anche considerare che in Oracle 'CharField' non può avere' max_length' maggiore di 2000, o emette un 'ORA-00910: lunghezza specificata troppo lunga per il suo errore di tipo dati '. – Dinei

22

In alcuni casi è legato a come viene utilizzato il campo. In alcuni motori DB le differenze di campo determinano come (e se) si cerca il testo nel campo. I CharField vengono generalmente utilizzati per oggetti ricercabili, ad esempio se si desidera cercare "uno" nella stringa "uno più due". Poiché le stringhe sono più corte, il motore richiede meno tempo per la ricerca. I campi di testo in genere non devono essere cercati attraverso (come forse il corpo di un blog) ma sono pensati per contenere grossi pezzi di testo. Ora la maggior parte di questo dipende dal DB Engine e come in Postgres non importa.

Anche se non importa, se si utilizza ModelForms si ottiene un diverso tipo di campo di modifica nel modulo. ModelForm genererà un modulo HTML della dimensione di una riga di testo per un CharField e multilinea per un campo di testo.

3

Ad es.,. 2 campi vengono aggiunti in un modello come seguente ..

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

Qui di seguito sono le query mysql eseguite quando vengono applicate le migrazioni.

per TextField (descrizione) il campo è definito come un longtext

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

per CharField (titolo) della max_length (obbligatorio) è definito come varchar(64)

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

CharField trovi max_length di 255 caratteri mentre TextField può contenere più di 255 caratteri. Usa TextField quando hai una stringa grande come input. È bene sapere che quando il parametro max_length viene passato in un TextField, passa la validazione della lunghezza al widget TextArea.