2011-09-08 34 views
187

Sự khác biệt giữa CharField()TextField() ở Django là gì? Các documentation nói rằng CharField() nên được sử dụng cho các chuỗi nhỏ hơn và TextField() nên được sử dụng cho các chuỗi lớn hơn. Được rồi, nhưng đường kẻ được vẽ giữa "nhỏ" và "lớn" ở đâu? Điều gì đang xảy ra dưới mui xe ở đây mà làm cho trường hợp này?Django CharField vs TextField

Trả lời

214

Đó là sự khác biệt giữa số liệu varchar (hoặc tương tự) của RDBMS thường được chỉ định với độ dài tối đa và hiệu quả hơn về hiệu suất hoặc lưu trữ - và text (hoặc tương tự). giới hạn triển khai được mã hóa cứng (không phải là lược đồ DB).

PostgreSQL 9, cụ thể, nêu rõ rằng "There is no performance difference among these three types", nhưng AFAIK có một số khác biệt trong ví dụ: MySQL, vì vậy đây là điều cần lưu ý.

Nguyên tắc chung là bạn sử dụng CharField khi bạn cần giới hạn độ dài tối đa, TextField nếu không.

Điều này thực sự không phải là Django cụ thể.

+24

Và ngược lại, nếu bạn sử dụng CharField thì bạn * phải * có độ dài tối đa –

+10

Tôi nhận thấy rằng việc sử dụng 'TextField' theo mặc định có thể ảnh hưởng đến tính di động của ứng dụng của bạn. Có thể không có một hiệu suất hit trên Postgres, nhưng Oracle sẽ lưu trữ nó như là một 'CLOB' trong đó có một số phiền toái, giống như không thể sử dụng trường trong câu lệnh WHERE. Chỉ cần một cái gì đó để xem xét. – Rob

+1

Một cũng nên xem xét rằng trong Oracle 'CharField' không thể có' max_length' lớn hơn 2000, hoặc nó phát hành một 'ORA-00910: quy định độ dài quá dài cho lỗi datatype' của nó. – Dinei

22

Trong một số trường hợp, nó được gắn với cách trường được sử dụng. Trong một số công cụ DB, sự khác biệt của trường xác định cách thức (và nếu) bạn tìm kiếm văn bản trong trường. CharFields thường được sử dụng cho những thứ có thể tìm kiếm được, giống như nếu bạn muốn tìm kiếm "một" trong chuỗi "một cộng hai". Vì các chuỗi ngắn hơn nên tốn ít thời gian hơn cho công cụ tìm kiếm. TextFields thường không có nghĩa là để được tìm kiếm thông qua (giống như nội dung của một blog) nhưng có nghĩa là để giữ các khối văn bản lớn. Bây giờ hầu hết điều này phụ thuộc vào DB Engine và giống như trong Postgres, nó không quan trọng.

Thậm chí nếu nó không quan trọng, nếu bạn sử dụng ModelForms bạn sẽ nhận được một loại trường chỉnh sửa khác trong biểu mẫu. ModelForm sẽ tạo ra một biểu mẫu HTML có kích thước của một dòng văn bản cho một CharField và multiline cho một TextField.

3

Ví dụ:,. 2 trường được thêm vào trong một mô hình như bên dưới ..

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

Dưới đây là các truy vấn mysql được thực hiện khi di chuyển được áp dụng.

cho TextField (mô tả) lĩnh vực này được định nghĩa là một longtext

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

cho CharField (tiêu đề) các max_length (bắt buộc) được định nghĩa là varchar(64)

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

CharField có max_length 255 ký tự trong khi TextField có thể chứa hơn 255 ký tự. Sử dụng TextField khi bạn có một chuỗi lớn làm đầu vào. Thật tuyệt khi biết rằng khi tham số max_length được truyền vào một TextField, nó vượt qua việc xác nhận độ dài cho tiện ích TextArea.

Các vấn đề liên quan