Hi group,

We have several accepted tickets regarding developer headaches when a 
blank=True field, which skips model validation by design[1], contains 
inappropriate empty values (e.g. None for a not-nullable field or the empty 
string where empty strings aren't allowed). I want to see what the 
community thinks is reasonable here and move them to a resolution or 
potentially wontfix them.

# 22224 — CharField <http://code.djangoproject.com/ticket/22224> (None from 
an application/json encoded payload isn’t cleaned to empty string)

# 27697 — JSONField <http://code.djangoproject.com/ticket/27697> (None 
isn’t cleaned to “{}”)

# 20205 — PositiveIntegerField <http://code.djangoproject.com/ticket/20205> 
(empty 
string unexpectedly passes model validation if blank=True. In this case the 
user was opting-in to model validation.)

***

For 22224—CharField—we could take Simon’s proposal 
<https://code.djangoproject.com/ticket/22224#comment:5> to last-minute cast 
None to empty string in get_db_prep_value() if the field’s 
empty_strings_allowed is True and null=False.

For 27696—JSONField—similarly, we could cast from None to "{}" if 
null=False.

For 20205—PositiveIntegerField, and by extension, any field where 
empty_strings_allowed is False—we might run model validation if we have an 
empty string to ensure we fail at the model level instead of the db, 
although this is not the usual practice for blank=True fields. See PR 
<https://github.com/django/django/pull/14666>.

The backwards compatibility concerns seem limited, because users are 
presumably working around these edge cases today, since invalid data is not 
being saved to the database. But there is the question of how much effort 
to expend here. I’m willing to see these through if we have a consensus 
around the best way to proceed.

All best,

Jacob


[1] blank=True and null=False and injecting-data-before-save being an idiom 
we don’t want to remove, 
see: https://code.djangoproject.com/ticket/22224#comment:7

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers  (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-developers+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-developers/58616ad3-54b6-4b21-b252-96040680fa04n%40googlegroups.com.

Reply via email to