2つの環境で検証
python3.10 -m venv drf314 venvs/
venvs/drf314/bin/pip install django==3.2.25 djangorestframework==3.14.0
python3.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 app
venvs/drf314/bin/python manage.py migrate
venvs/drf314/bin/python manage.py makemigrations
venvs/drf314/bin/python manage.py shell
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)
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 shell
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)
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 >>>
所感
正しい挙動のように思える。何がなんだか分からない。