2011-12-12 28 views
8

Tôi đang cố gắng để tạo ra một lĩnh vực với những lựa chọn có giới hạn:Mô hình django CharField: max_length không hoạt động?

Action_Types=(
       ('0','foo'), 
       ('1','bar'), 
      ) 

class Foo(models.Model): 
    myAction=models.CharField(max_length=1,choices=Action_Types) 

    def __unicode__(self): 
     return '%d %s'%(self.pk,self.myAction) 

Tuy nhiên, khi tôi đã cố gắng để chèn nội dung vi phạm các quy tắc, nó đã thành công mà không cần bất kỳ thông báo lỗi hoặc cảnh báo (với "vỏ manage.py"). Có vẻ như bất kỳ văn bản của bất kỳ chiều dài có thể được đưa vào lĩnh vực này. Tôi đang sử dụng SQLite3 làm phụ trợ.

Có phải là như vậy không? Hoặc nếu tôi bỏ lỡ một cái gì đó?

Trả lời

16

SQLite không thực thi độ dài của VARCHAR.

Từ SQLite Frequently asked questions:

(9) kích thước tối đa của một VARCHAR trong SQLite là gì?

SQLite không thực thi chiều dài của VARCHAR. Bạn có thể khai báo một VARCHAR (10) và SQLite sẽ rất vui khi cho phép bạn đặt 500 ký tự trong đó. Và nó sẽ giữ nguyên tất cả 500 ký tự - nó không bao giờ cắt ngắn.

Nếu bạn cập nhật cơ sở dữ liệu bằng cách sử dụng quản trị viên django hoặc mẫu biểu mẫu, Django sẽ thực hiện xác thực độ dài cho bạn. Trong trình bao, bạn có thể gọi thủ công full_clean trước khi lưu và bắt lỗi xác thực.

f = Foo(myAction="more than 1 char") 
try: 
    f.full_clean() 
    f.save() 
except ValidationError as e: 
    # Do something based on the errors contained in e.message_dict. 
+1

Cảm ơn câu trả lời, Alasdair! Có vẻ như nơi duy nhất để kiểm tra tính chính xác là bằng cách sử dụng full_clean(). –

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