From d58bf96f4610cac61ccb68eb0b84bccd1a5235d8 Mon Sep 17 00:00:00 2001 From: Arto Jantunen Date: Mon, 23 Aug 2021 12:17:29 +0300 Subject: [PATCH] Allow nullable EmbeddedDocumentLists to be set to None The case for a nullable EmbeddedDocumentField was handled in commit d1543516e841, but the other two branches (EmbeddedDocumentList and DictField) need this handling as well. Add a test for EmbeddedDocumentList and fix in a generic way. This fixes issue #250. --- rest_framework_mongoengine/serializers.py | 6 +++-- tests/test_embedded.py | 28 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/rest_framework_mongoengine/serializers.py b/rest_framework_mongoengine/serializers.py index 644fcc4..47953ed 100644 --- a/rest_framework_mongoengine/serializers.py +++ b/rest_framework_mongoengine/serializers.py @@ -222,9 +222,11 @@ def recursive_save(self, validated_data, instance=None): try: field = self.fields[key] + if value is None: # issue when the value is none + me_data[key] = value # for EmbeddedDocumentSerializers, call recursive_save - if isinstance(field, EmbeddedDocumentSerializer): - me_data[key] = field.recursive_save(value) if value is not None else value # issue when the value is none + elif isinstance(field, EmbeddedDocumentSerializer): + me_data[key] = field.recursive_save(value) # same for lists of EmbeddedDocumentSerializers i.e. # ListField(EmbeddedDocumentField) or EmbeddedDocumentListField diff --git a/tests/test_embedded.py b/tests/test_embedded.py index 30cd9f2..7799a1b 100644 --- a/tests/test_embedded.py +++ b/tests/test_embedded.py @@ -40,6 +40,10 @@ class ListEmbeddingDoc(Document): embedded_list = fields.EmbeddedDocumentListField(DumbEmbedded) +class NullableListEmbeddingDoc(Document): + embedded_list = fields.EmbeddedDocumentListField(DumbEmbedded, null=True) + + class RecursiveEmbeddingDoc(Document): embedded = fields.EmbeddedDocumentField(SelfEmbeddingDoc) @@ -282,6 +286,12 @@ class Meta: fields = '__all__' +class NullableListEmbeddingSerializer(DocumentSerializer): + class Meta: + model = NullableListEmbeddingDoc + fields = '__all__' + + class NestedEmbeddingSerializer(DocumentSerializer): class Meta: model = NestedEmbeddingDoc @@ -582,6 +592,24 @@ def test_update(self): def test_update_partial(self): pass + def test_list_none(self): + data = { + 'embedded_list': None, + } + + serializer = NullableListEmbeddingSerializer(data=data) + assert serializer.is_valid(), serializer.errors + + instance = serializer.save() + assert isinstance(instance, NullableListEmbeddingDoc) + assert instance.embedded_list is None + + expected = { + 'id': str(instance.id), + 'embedded_list': None, + } + assert serializer.data == expected + class ValidatingEmbeddedModel(EmbeddedDocument): text = fields.StringField(min_length=3)