I'm very interested in the idea of expanding the database level constraints that can be supplied to a database schema, and also automatically apply the same constraints to the model/view in django.
The various backends that support them, I believe already apply such constraints for PositiveIntegerField() and so on. I would like to see the ability to define extra constraints as part of the model definition, and have these applied in a similar manner to the unique and unique_together constraints. I am more familiar with PostgreSQL than anything else, but I believe the syntax I am about to propose will work in several databases. Check constraints can be divided into two types: column level and table level. With PostgreSQL, a column level constraint can reference another column, but I would suggest that a constraint that does so should be a table level constraint. Column level constraints could be declared as a keyword argument to the field constructor: column = models.IntegerField(constraint='< 100') Table level constraints could be declared as an attribute on the Meta class of the model: check_constraints = ('start < finish', ) Validation of the models should pick up when an incorrect constraint has been declared. For instance, not using a valid operator ('# 100') or not supplying a valid comparison value ('< 1e' for an IntegerField) would be invalid column constraints, and comparing a Date to an Integer would be an invalid table level constraint. The code that should be generated would add "CHECK ('column' < 100)" to the column definition in the first instance, and "CONSTRAINT app_table_start_finish CHECK ('start' < 'finish')" to the table definition in the second case. I have already written code that fulfils these requirements, and some tests for validation errors. I have also written additions to BaseModelForm which validates according to the defined constraint(s). At this stage, I have not allowed for more complicated relationships, such as ('first < second + 65'), but this is planned. Is there anyone else interested in this? Should I put this into a ticket and attach my current diff? --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com To unsubscribe from this group, send email to django-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-developers?hl=en -~----------~----~----~----~------~----~------~--~---