#35223: Fields with db_default raise ValidationErrors when full_clean() called
-------------------------------------+-------------------------------------
     Reporter:  Brian Ibbotson       |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  Database layer       |                  Version:  5.0
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Description changed by Brian Ibbotson:

Old description:

> Starting to migrate models in my (large) project to use Django 5’s new
> db_default attribute for fields (using Django 5.0.2), encountering
> behavior contrary to my expectations.
>
> A field with {{{db_default}}} raises a {{{ValidationError}}} when
> {{{full_clean()}}} called, if that field has been omitted from the
> {{{create()}}} call.
>
> This is (to me) unexpected behavior. Would expect that no error would be
> raised, the instance would be saved successfully, with the specified
> {{{db_default}}} value set at the database level.
>
> Has been explained to me in the Django forums that this is correct, that
> I should instead either
>
> (1) explicitly choose to {{{exclude}}} the missing fields from
> {{full_clean()}}} call,
> (2) write a custom clean method for each field, or
> (3) simply save the instance rather than calling {{{full_clean()}}}
>
> Had always been impressed on me that it is best practice to always call
> {{{full_clean()}}} on instance creation and/or update.
>
> In either case, having to determine the missing fields and annotate the
> {{{full_clean()}}} call or write a custom clean method per field seem to
> work against the usual conception of a default value, which should
> propagate... well, ''by default'' and allow for simpler operation where
> possible.
>
> I would suggest having fields with {{{db_default}}} be excluded by
> default from {{{full_clean()}}}
>
> If the current behavior is re-affirmed, would suggest incorporating the
> suggested 3 workaround steps into the Django documentation, as I suspect
> most users would have similar expectations as myself when implementing
> this in future code.

New description:

 Starting to migrate models in my (large) project to use Django 5’s new
 db_default attribute for fields (using Django 5.0.2), encountering
 behavior contrary to my expectations.

 A field with {{{db_default}}} raises a {{{ValidationError}}} when
 {{{full_clean()}}} called, if that field has been omitted from the
 {{{create()}}} call.

 This is (to me) unexpected behavior. Would expect that no error would be
 raised, the instance would be saved successfully, with the specified
 {{{db_default}}} value set at the database level.

 Has been explained to me in the Django forums that this is correct, that I
 should instead either

 (1) explicitly choose to {{{exclude}}} the missing fields from
 {{{full_clean()}}} call,
 (2) write a custom clean method for each field, or
 (3) simply save the instance rather than calling {{{full_clean()}}}

 Had always been impressed on me that it is best practice to always call
 {{{full_clean()}}} on instance creation and/or update.

 In either case, having to determine the missing fields and annotate the
 {{{full_clean()}}} call or write a custom clean method per field seem to
 work against the usual conception of a default value, which should
 propagate... well, ''by default'' and allow for simpler operation where
 possible.

 I would suggest having fields with {{{db_default}}} be excluded by default
 from {{{full_clean()}}}

 If the current behavior is re-affirmed, would suggest incorporating the
 suggested 3 workaround steps into the Django documentation, as I suspect
 most users would have similar expectations as myself when implementing
 this in future code.

--
-- 
Ticket URL: <https://code.djangoproject.com/ticket/35223#comment:1>
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018db3999ef9-c470e772-ef1c-4193-8bfb-f0c404a3d4c2-000000%40eu-central-1.amazonses.com.

Reply via email to