|
4 | 4 | from django.test import TestCase
|
5 | 5 |
|
6 | 6 | from rest_framework import serializers
|
| 7 | +from rest_framework.compat import postgres_fields |
| 8 | +from rest_framework.serializers import raise_errors_on_nested_writes |
7 | 9 |
|
8 | 10 |
|
9 | 11 | class TestNestedSerializer:
|
@@ -302,3 +304,50 @@ class Meta:
|
302 | 304 | 'serializer `tests.test_serializer_nested.DottedAddressSerializer`, '
|
303 | 305 | 'or set `read_only=True` on dotted-source serializer fields.'
|
304 | 306 | )
|
| 307 | + |
| 308 | + |
| 309 | +if postgres_fields: |
| 310 | + class NonRelationalPersonModel(models.Model): |
| 311 | + """Model declaring a postgres JSONField""" |
| 312 | + data = postgres_fields.JSONField() |
| 313 | + |
| 314 | + |
| 315 | +@pytest.mark.skipif(not postgres_fields, reason='psycopg2 is not installed') |
| 316 | +class TestNestedNonRelationalFieldWrite: |
| 317 | + """ |
| 318 | + Test that raise_errors_on_nested_writes does not raise `AssertionError` when the |
| 319 | + model field is not a relation. |
| 320 | + """ |
| 321 | + |
| 322 | + def test_nested_serializer_create_and_update(self): |
| 323 | + |
| 324 | + class NonRelationalPersonDataSerializer(serializers.Serializer): |
| 325 | + occupation = serializers.CharField() |
| 326 | + |
| 327 | + class NonRelationalPersonSerializer(serializers.ModelSerializer): |
| 328 | + data = NonRelationalPersonDataSerializer() |
| 329 | + |
| 330 | + class Meta: |
| 331 | + model = NonRelationalPersonModel |
| 332 | + fields = ['data'] |
| 333 | + |
| 334 | + serializer = NonRelationalPersonSerializer(data={'data': {'occupation': 'developer'}}) |
| 335 | + assert serializer.is_valid() |
| 336 | + assert serializer.validated_data == {'data': {'occupation': 'developer'}} |
| 337 | + raise_errors_on_nested_writes('create', serializer, serializer.validated_data) |
| 338 | + raise_errors_on_nested_writes('update', serializer, serializer.validated_data) |
| 339 | + |
| 340 | + def test_dotted_source_field_create_and_update(self): |
| 341 | + |
| 342 | + class DottedNonRelationalPersonSerializer(serializers.ModelSerializer): |
| 343 | + occupation = serializers.CharField(source='data.occupation') |
| 344 | + |
| 345 | + class Meta: |
| 346 | + model = NonRelationalPersonModel |
| 347 | + fields = ['occupation'] |
| 348 | + |
| 349 | + serializer = DottedNonRelationalPersonSerializer(data={'occupation': 'developer'}) |
| 350 | + assert serializer.is_valid() |
| 351 | + assert serializer.validated_data == {'data': {'occupation': 'developer'}} |
| 352 | + raise_errors_on_nested_writes('create', serializer, serializer.validated_data) |
| 353 | + raise_errors_on_nested_writes('update', serializer, serializer.validated_data) |
0 commit comments