Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions rest_framework_mongoengine/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
28 changes: 28 additions & 0 deletions tests/test_embedded.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -282,6 +286,12 @@ class Meta:
fields = '__all__'


class NullableListEmbeddingSerializer(DocumentSerializer):
class Meta:
model = NullableListEmbeddingDoc
fields = '__all__'


class NestedEmbeddingSerializer(DocumentSerializer):
class Meta:
model = NestedEmbeddingDoc
Expand Down Expand Up @@ -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)
Expand Down