2つの環境で検証
python3.10 -m venv drf314 venvs/
venvs/drf314/bin/pip install django==3.2.25 djangorestframework==3.14.0python3.10 -m venv venvs/drf315
venvs/drf315/bin/pip install django==3.2.25 djangorestframework==3.15.1影響のある修正
https://github.com/encode/django-rest-framework/pull/9030
関係のある定義
モデル
- blank
- null
- default
シリアライザーフィールド
- required
- allow_null
- default
マトリックス
| フィー | model | model | model | serializer | serializer | serializer | 期待する動作 |
|---|---|---|---|---|---|---|---|
| ルド | blank | null | default | required | allow_null | default | |
| aa | なし | なし | なし | なし | なし | なし | |
| bb | False | なし | なし | False | なし | なし | |
| cc | True | なし | なし | True | なし | なし | |
| dd | なし | False | なし | なし | False | なし | |
| ee | False | False | なし | False | False | なし | |
| ff | True | False | なし | True | False | なし | |
| gg | なし | True | なし | なし | True | なし | |
| hh | False | True | なし | False | True | なし | |
| ii | True | True | なし | True | True | なし | |
| jj | なし | なし | 1 | なし | なし | 1 | |
| kk | False | なし | 1 | False | なし | 1 | |
| ll | True | なし | 1 | True | なし | 1 | |
| mm | なし | False | 1 | なし | False | 1 | |
| nn | False | False | 1 | False | False | 1 | |
| oo | True | False | 1 | True | False | 1 | |
| pp | なし | True | 1 | なし | True | 1 | |
| False | True | 1 | False | True | 1 | ||
| rr | True | True | 1 | True | True | 1 |
プロジェクトの準備
venvs/drf314/bin/django-admin startproject proj .venvs/drf314/bin/python manage.py startapp appvenvs/drf314/bin/python manage.py migratevenvs/drf314/bin/python manage.py makemigrationsvenvs/drf314/bin/python manage.py shellfrom app.serializers import ExampleSerializer
ka = ExampleSerializer(data={"a": 1, "b": 1, "c": 1, "d": 1, "e": 1, "f": 1, "g": 1, "h": 1})
ka.is_valid(raise_exception=True)
kb = ka.save()
kc = ExampleSerializer(instance=kb, data={"a":2, "g": 2})
kc.is_valid(raise_exception=True)
kd = kc.save()>>> from app.serializers import ExampleSerializer
>>> ka = ExampleSerializer(data={"a": 1, "b": 1, "c": 1, "d": 1, "e": 1, "f": 1, "g": 1, "h": 1})
>>> ka.is_valid(raise_exception=True)
True
>>> kb = ka.save()
>>> kc = ExampleSerializer(instance=kb, data={"a":2, "g": 2})
>>> kc.is_valid(raise_exception=True)
True
>>> kc.to_internal_value()
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: Serializer.to_internal_value() missing 1 required positional argument: 'data'
>>> kc.to_internal_value(data={"a":2, "g": 2})
OrderedDict([('a', 2), ('g', 2)])>>> from app.serializers import ExampleSerializer
>>> ka = ExampleSerializer(data={"a": 1, "b": 1, "c": 1, "d": 1, "e": 1, "f": 1, "g": 1, "h": 1})
>>> ka.is_valid(raise_exception=True)
True
>>> kb = ka.save()
>>> kb
a = 1
b = 1
c = 1
d = 1
e = 1
f = 1
g = 1
h = 1
>>> kc = ExampleSerializer(instance=kb, data={"a":2, "g": 2})
>>> kc.is_valid(raise_exception=True)
True
>>> kd = kc.save()
>>> kd
a = 2
b = 1
c = 1
d = 1
e = 1
f = 1
g = 2
h = 1
>>>
venvs/drf315/bin/python manage.py shellfrom app.serializers import ExampleSerializer
ka = ExampleSerializer(data={"a": 1, "b": 1, "c": 1, "d": 1, "e": 1, "f": 1, "g": 1, "h": 1})
ka.is_valid(raise_exception=True)
kb = ka.save()
kc = ExampleSerializer(instance=kb, data={"a":2, "g": 2})
kc.is_valid(raise_exception=True)
kd = kc.save()>>> from app.serializers import ExampleSerializer
>>> ka = ExampleSerializer(data={"a": 1, "b": 1, "c": 1, "d": 1, "e": 1, "f": 1, "g": 1, "h": 1})
>>> ka.is_valid(raise_exception=True)
True
>>> kb = ka.save()
>>> kb
a = 1
b = 1
c = 1
d = 1
e = 1
f = 1
g = 1
h = 1
>>> kc = ExampleSerializer(instance=kb, data={"a":2, "g": 2})
>>> kc.is_valid(raise_exception=True)
True
>>> kd = kc.save()
>>> kd
a = 2
b = 1
c = 1
d = 1
e = 1
f = 1
g = 2
h = 1
>>>
所感
正しい挙動のように思える。何がなんだか分からない。