2011-09-08 6 views
187

Django'da CharField() ve TextField() arasındaki fark nedir? documentation, daha küçük dizeler için CharField() kullanılması gerektiğini ve daha büyük dizeler için TextField() kullanılmasının gerektiğini söylüyor. Tamam, ama "küçük" ile "büyük" arasında çizilen çizgi nerede? Davlumbazın altında neler oluyor, bu da böyle mi oluyor?Django CharField ile TextField

cevap

214

RDBMS varchar (veya benzerleri) arasındaki bir farktır - bunlar genellikle maksimum uzunluk ile belirtilir ve performans veya depolama açısından daha verimli olabilir ve text (veya benzerleri) - bunlar genellikle yalnızca kodlanmış uygulama sınırları (bir DB şeması değil).

PostgreSQL 9, özel olarak ise, bu "There is no performance difference among these three types" belirtmektedir, ama AFAIK örneğin bazı farklılıklar vardır MySQL, bu akılda tutulması gereken bir şey.

Aksi takdirde, maksimum uzunluğu TextField sınırlamanız gerektiğinde, CharField kullandığınız iyi bir kuraldır.

Bu, aslında Django'ya özgü de değil.

+24

Ve tam tersi, o zaman * zorunluluk * Ben varsayılan olarak 'TextField' kullanarak uygulamanızın taşınabilirliği etkileyebilir tespit ettik maksimum uzunluğu –

+10

var. Postgres'te bir performans isabeti olmayabilir, ancak Oracle WHERE ifadelerinde alanı kullanamayacağı için bazı can sıkıcılıkları olan bir CLOB olarak saklayacaktır. Sadece düşünülmesi gereken bir şey. – Rob

+1

Ayrıca, Oracle 'CharField'da 2000'den daha büyük bir" max_length "değerine sahip olamayacağını veya bir" ORA-00910: belirtilen uzunluk için uzun bir süre veri türü "hatası vereceğini de dikkate almalısınız. – Dinei

22

Bazı durumlarda, alanın nasıl kullanıldığına bağlıdır. Bazı DB motorlarında alan farklılıkları, alandaki metni nasıl (ve eğer) aradığınızı belirler. CharFields tipik olarak "bir artı iki" dizgisinde "bir" aramak istiyorsanız, aranabilir şeyler için kullanılır. Dizeler daha kısa olduğundan, motorun arama yapması için daha az zaman harcarlar. TextFields tipik olarak (belki de bir blogun gövdesi gibi) arandığı anlamına gelmez, ancak büyük metin parçalarını tutması amaçlanır. Şimdi bunların çoğu DB Engine'e bağlı ve Postgres'de olduğu gibi önemli değil.

ModelForms kullanırsanız, farketmez, formda farklı bir düzenleme alanı alırsınız. ModelForm, bir TextField için bir CharField ve çok satırlı için bir metin satırının bir HTML biçimini oluşturacaktır. Örn., Için,

3

. 2 alanlarına

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

Aşağıda göçler uygulandığında yürütülen mysql sorguları .. aşağıdaki gibi bir modelde eklenir. TextField (açıklama) alanı için

olarak tanımlanır Charfield 255 karakter MAX_LENGTH sahip longtext

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

varchar(64)

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

olarak tanımlanır CharField (başlık) MAX_LENGTH (gerekli) bir TextField 255 karakterden fazla tutabilirken, giriş olarak geniş bir dizgeye sahip olduğunuzda TextField kullanın. Max_length parametresi bir TextField uygulamasına geçirildiğinde TextArea widget'ına uzunluk doğrulamasından geçtiğini bilmek güzel. Eğer Charfield kullanırsanız