In Django 2.1, as part of adding `null` support to `BooleanField`, the
previously implicit/hardcoded `blank=True` of `BooleanField` was removed:
https://github.com/django/django/commit/5fa4f40f45fcdbb7e48489ed3039a314b5c961d0
#diff-bf776a3b8e5dbfac2432015825ef8afeL995
In one of our projects, we had a model with a `BooleanField` defined like
so:
{{{#!python
class PerformanceAlert(models.Model):
id = models.AutoField(primary_key=True)
# ...
is_regression = models.BooleanField()
}}}
The REST API for that model uses django-rest-framework's
`ModelSerializer`, which generates validation rules based on the model
properties.
In Django 2.0, the d-r-f API serializer's `repr()` is:
{{{#!python
PerformanceAlertSerializer():
id = IntegerField(read_only=True)
# ...
is_regression = BooleanField(required=False)
}}}
But under Django 2.1 this changed to
{{{#!python
PerformanceAlertSerializer():
id = IntegerField(read_only=True)
# ...
is_regression = BooleanField()
}}}
As such under Django 2.1 API calls that were previously successful then
failed with `This field is required.`. (It turned out our API is using
`PUT`s in places it should really be using `PATCH`.)
We were able to resolve the issue by adjusting
`PerformanceAlertSerializer` such that it explicitly configures the field
with `serializers.BooleanField(required=False)`, however it would be great
to mention this ~breaking change in the Django 2.1 release notes (and also
as a "changed in" on the `BooleanField` entry on the fields page) -
particularly since it looks like several other people have hit the same
issue:
https://github.com/django/django/commit/5fa4f40f45fcdbb7e48489ed3039a314b5c961d0#r30206260
https://code.djangoproject.com/ticket/29921
If I get a chance I'll open a PR in the next few weeks, but happy for
someone to beat me to it.
Many thanks :-)
--
Ticket URL: <https://code.djangoproject.com/ticket/30216>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* owner: nobody => Darius Azimi
* status: new => assigned
--
Ticket URL: <https://code.djangoproject.com/ticket/30216#comment:1>
* owner: Darius Azimi => (none)
* status: assigned => new
--
Ticket URL: <https://code.djangoproject.com/ticket/30216#comment:2>
* type: Uncategorized => Cleanup/optimization
* easy: 1 => 0
* stage: Unreviewed => Accepted
Comment:
I'm not sure what the note would say exactly. Is
"`BooleanField.__init__()` no longer sets `blank=True`." enough? It
doesn't seem to give much explanation about possible ramifications of the
change and it's not Django's place to describe how django-rest-framework
is affected. This behavior isn't documented in `ref/models/fields.txt`,
and we normally don't include a versionchanged annotation for something
that's undocumented.
--
Ticket URL: <https://code.djangoproject.com/ticket/30216#comment:1>
* owner: nobody => sejd0n
* status: new => assigned
--
Ticket URL: <https://code.djangoproject.com/ticket/30216#comment:2>
* owner: nobody => David Vaz
* status: new => assigned
Comment:
submited a [https://github.com/django/django/pull/11826 PR]
--
Ticket URL: <https://code.djangoproject.com/ticket/30216#comment:2>
* status: assigned => closed
* resolution: => fixed
Comment:
In [changeset:"a6972e88547ad5a51592f2b6d5046754c4b59394" a6972e88]:
{{{
#!CommitTicketReference repository=""
revision="a6972e88547ad5a51592f2b6d5046754c4b59394"
[2.2.x] Fixed #30216 -- Doc'd that BooleanField is no longer blank=True in
Django 2.1.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/30216#comment:3>
Comment (by Mariusz Felisiak <felisiak.mariusz@…>):
In [changeset:"1556a67c65c336ab12961c6123b129ac10e729b8" 1556a67c]:
{{{
#!CommitTicketReference repository=""
revision="1556a67c65c336ab12961c6123b129ac10e729b8"
[2.1.x] Fixed #30216 -- Doc'd that BooleanField is no longer blank=True in
Django 2.1.
Backport of a6972e88547ad5a51592f2b6d5046754c4b59394 from stable/2.2.x
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/30216#comment:4>
* has_patch: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/30216#comment:5>