Como @stefanw dice, es mejor experiencia de usuario para comprobar en el método de limpieza de la forma.
Esto es suficiente si está seguro de que no hay, y nunca existirá, otra forma de cambiar el valor. Pero ya que rara vez se puede estar seguro de que, si la consistencia de base de datos es importante, se puede añadir otro cheque (además de la forma), uno de:
- La manera más fácil y base de datos independiente es en el modelo de guardar método como @ umnik700 dijo. Tenga en cuenta que esto aún no impide que otros usuarios de la base de datos (otra aplicación o la interfaz de administración) creen un estado incoherente.
Para estar 'completamente' seguro de que la base de datos es coherente, puede agregar una restricción de nivel de base de datos. P.ej. puede crear una migración con RunSQL y SQL, algo similar (no probado):
migrations.RunSQL('ALTER TABLE app_event ADD CONSTRAINT chronology CHECK (start_date > end_date);')
(No se ha probado). Esto puede depender de la base de datos, lo cual es una desventaja, por supuesto.
En su ejemplo, no es probablemente vale la pena (tiempos de inicio incorrecto/final sólo se ven un poco raro, pero sólo afectan el único evento inconsistente), y que no quieren cambios en el esquema manuales. Pero es útil en casos donde la consistencia es crítica.
EDIT: También puede simplemente guardar la hora de inicio y la duración, en lugar de las horas de inicio y fin.
lo que usted sugiere como restricción no se puede definir como una declaración SQL, por lo que solo se esperan cambios de dicha verificación en forma de administrador. Puede hacerlo anulando la función de guardado de forma administrativa para esa clase. La respuesta de umnik700 muestra cómo puedes hacerlo. – Numenor
En realidad, hay una restricción "CHECK" en SQL. PostgreSQL admite esto: http://www.postgresql.org/docs/8.1/static/ddl-constraints.html Sin embargo, MySQL no es compatible con esto: la cláusula CHECK es analizada pero ignorada por todos los motores de almacenamiento (vea http : //dev.mysql.com/doc/refman/5.5/en/create-table.html) –
@ slack3r: Gracias. Sé que hay un cheque, pero solo lo quiero en un nivel superior, en el nivel de declaración de metadatos de Django. Evito los cambios de esquema. – Viet