Django CharField vs TextField


302

Sự khác biệt giữa CharField()TextField()trong Django là gì? Các tài liệu 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 đâu là ranh giới giữa "nhỏ" và "lớn"? Điều gì đang xảy ra dưới mui xe ở đây làm cho trường hợp này?

Câu trả lời:


354

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

PostgreQuery 9, cụ thể, nói rằng "Không có sự khác biệt về hiệu năng giữa ba loại này" , nhưng AFAIK có một số khác biệt trong ví dụ như MySQL, vì vậy đây là điều cần lưu ý.

Một nguyên tắc nhỏ là bạn sử dụng CharFieldkhi bạn cần giới hạn độ dài tối đa, TextFieldnếu không.

Điều này cũng không thực sự đặc trưng cho Django.


43
Và ngược lại, nếu bạn sử dụng CharField thì bạn phải có chiều dài tối đa
Sam Svenbjorgchristiensensen

17
Tôi đã thấy rằng việc sử dụng TextFieldtheo 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ó hiệu suất nào đạt được trên Postgres, nhưng Oracle sẽ lưu trữ nó dưới dạng CLOBcó một số phiền toái, như không thể sử dụng trường trong các câu lệnh WHERE. Chỉ cần một cái gì đó để xem xét.
Cướp

3
Người ta cũng nên xem xét rằng trong Oracle CharFieldkhông thể có max_lengthnhiều hơn 2000 hoặc nó ORA-00910: specified length too long for its datatypegây ra lỗi.
Dinei

Cần lưu ý, khi xem xét các thuộc tính trường, tài liệu Postgres cũng nói (nhấn mạnh của tôi): "chuỗi ký tự dài nhất có thể được lưu trữ là khoảng 1 GB. (Giá trị tối đa sẽ được phép cho n trong khai báo kiểu dữ liệu là ít hơn thế [...] Nếu bạn muốn lưu trữ các chuỗi dài không có giới hạn trên cụ thể, hãy sử dụng văn bản hoặc ký tự thay đổi mà không cần chỉ định độ dài, thay vì tạo giới hạn độ dài tùy ý .) "
iff_or

3
Tôi tin rằng sự khác biệt thực sự quan trọng giữa hai trong django là cách một khung nhìn sẽ xử lý trường này. Trong chế độ xem chỉnh sửa chung, TextField sẽ hiển thị dưới dạng đầu vào có thể định cỡ lại nhiều dòng; trong khi CharField là một đầu vào dòng đơn. Tôi chưa xem nguồn django cho TextField, nhưng tôi sẽ giả sử nếu bất kỳ html được tạo nào được gắn vào TextField, thì rất có thể nó sẽ thực hiện một cách để thao tác đúng văn bản đa tuyến.
Tường thành

36

Trong một số trường hợp, nó được gắn với cách sử dụng trường. Trong một số công cụ DB, sự khác biệt của trường xác định cách (và nếu) bạn tìm kiếm văn bản trong trường. CharField thường được sử dụng cho những thứ có thể tìm kiếm được, 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, chúng sẽ tốn ít thời gian hơn cho công cụ tìm kiếm thông qua. TextField thường không có nghĩa là được tìm kiếm thông qua (như có thể là phần thân của blog) nhưng có nghĩa là chứa 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, điều đó không thành vấn đề.

Ngay cả khi điều đó 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 dạng HTML có kích thước của một dòng văn bản cho CharField và multiline cho TextField.


2
Đây là lời giải thích tốt nhất bởi vì nó đề cập đến cách nó tạo ra trường trong một biểu mẫu. Charfield sẽ chỉ là một đầu vào một dòng, nhưng TextField sẽ là một multiline có thể thay đổi kích thước. TextField có ý nghĩa khi bạn chủ yếu thực hiện các khung nhìn lớp chung. Nó hoạt động tuyệt vời cho một trường mô tả hoặc tương tự. Tôi cũng thích cách renderbox đề cập rằng bạn sẽ không muốn sử dụng nó cho bất kỳ bộ lọc / tìm kiếm nào.
Tường thành

8

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

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 thi khi di chuyển được áp dụng.


cho TextField(mô tả) trường được định nghĩa là mộtlongtext

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

Độ dài tối đa TextFieldcủa MySQL là 4GB theo tổng quan kiểu chuỗi .


đối với CharField(tiêu đề), 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;

1
nit: tài liệu Django khuyên Avoid using null on string-based fields such as CharField and TextField:: docs.djangoproject.com/en/2.0/ref/models/fields/#null vì vậy tốt nhất nên giữ lại null=False.
modulitos

7

CharFieldcó max_length của các 255ký tự trong khi TextFieldcó thể chứa nhiều hơn các 255ký tự. Sử dụng TextFieldkhi bạn có một chuỗi lớn làm đầu vào. Thật tốt khi biết rằng khi max_lengththam số được truyền vào, TextFieldnó sẽ xác nhận độ dài cho TextAreawidget.


"Bất kỳ trường nào được lưu trữ với VARCHARcác loại cột đều max_lengthbị giới hạn ở 255 ký tự nếu bạn đang sử dụng unique = True cho trường. " (Nhấn mạnh của tôi.)
l0b0

-4

Tôi gặp một vấn đề kỳ lạ và hiểu một sự khác biệt kỳ lạ khó chịu: khi tôi nhận được URL từ người dùng dưới dạng CharField và sau đó sử dụng nó trong html một thẻ bởi href, nó thêm url đó vào url của tôi và đó không phải là điều tôi muốn. Nhưng khi tôi làm điều đó bằng Textfield,chỉ chuyển URL mà người dùng đã nhập. nhìn vào đây: địa chỉ trang web của tôi:http://myweb.com

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

khi nhấp vào nó: http://myweb.comhttp://some-address.com

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

khi nhấp vào nó: http://some-address.com

Tôi phải đề cập rằng URL được lưu chính xác giống nhau trong DB theo hai cách nhưng tôi không biết tại sao kết quả lại khác nhau khi nhấp vào chúng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.