#30581: Allow constraints to be used for validation (in Python)
-------------------------------------+-------------------------------------
Reporter: Carlton | Owner: nobody
Gibson |
Type: New | Status: new
feature |
Component: Database | Version: 2.2
layer (models, ORM) | Keywords: constraints,
Severity: Normal | validation
Triage Stage: Accepted | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
Follow-up from #30547, where we documented how database constraints relate
to validation.
**Executive summary**: In general they don't. Instead you get an
`IntegrityError` on `save()`. Except, `UniqueConstraint` is able to tie-in
to the existing `validate_unique()` logic, so you will get a
`ValidationError` on `full_clean()`.
It would be **nice** if all constraints could (in principle) be used for
Python-level validation, in addition to setting up the database
constraint. (We might image `ModelForm`, say, being able to extract
correct validation logic from the model definition, and so on.)
Initial thought is that Python validators could be inferred from `Q`
objects:
{{{
CheckConstraint(check=Q(age__gte=18), name='age_gte_18')
}}}
Looks like it maps to a simple `lambda age: age > 18`, for example.
More complex examples will cause issues. Discussion:
* [https://github.com/django/django/pull/10796#discussion_r244216763 PR
#10796 (comment)]
* [https://github.com/django/django/pull/388#issuecomment-8863209 PR #388
(comment)]
So we **might** be able to do **some** auto-generation but first goal here
should (I guess) be an optional hook on `BaseConstraint` that **if
implemented** can be picked up for use in validation. (Or similar.)
I'll create this as Accepted, since existing discussions imply that.
--
Ticket URL: <https://code.djangoproject.com/ticket/30581>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/056.e19bf2e6d5ed1819dc946e7751372bdb%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.