2011-12-12 10 views
8

estoy tratando de hacer un campo con opciones limitadas:django modelo CharField: max_length no funciona?

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) 

Sin embargo, cuando yo estaba tratando de insertar contenido que viola las reglas, se logró sin ningún mensaje de error o advertencia (con "manage.py shell") Parece que cualquier texto de cualquier longitud se puede poner en este campo. Estoy usando SQLite3 como back-end.

¿Se supone que es así? O si me perdí algo?

Respuesta

16

SQLite no impone la longitud de un VARCHAR.

Desde el SQLite Frequently asked questions:

(9) ¿Cuál es el tamaño máximo de un VARCHAR en SQLite?

SQLite no impone la longitud de un VARCHAR. Puede declarar un VARCHAR (10) y SQLite estará feliz de permitirle poner 500 caracteres en él. Y mantendrá intactos los 500 caracteres, nunca trunca.

Si actualiza la base de datos utilizando el administrador de django o los formularios del modelo, Django hará la validación de la longitud por usted. En el shell, puede llamar manualmente al full_clean antes de guardar, y detectar el error de validación.

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

Gracias por la respuesta, Alasdair! Parece que el único lugar para verificar la corrección es mediante el uso de full_clean(). –