umutbozkurt/django-rest-framework-mongoengine

EmbeddedDocument field in DocumentSerializer can't be set to null

sebitoelcheater opened this issue · 3 comments

I have a Charger document that contains a discount EmbeddedDocumentField. I also have a serializer for Charger.

class Discount(mongoengine.EmbeddedDocument):
    amount = mongoengine.FloatField(default=0)
    start = mongoengine.DateTimeField(default=datetime.datetime.fromtimestamp(0))
    end = mongoengine.DateTimeField(default=datetime.datetime.fromtimestamp(253400999999))

class Charger(Document):
    discount = mongoengine.EmbeddedDocumentField(Discount, null=True, required=False)

class ChargerSerializer(DocumentSerializer):
    class Meta:
        model = Charger
        fields = ('id', 'discount')
        extra_kwargs = {
            'discount': {'required': False, 'allow_null': True}
        }

When I call save on ChargerSerializer with discount set to None, it raises this error

  File "/Users/sebito/Developer/Proyectos/cargoo/cargoo/api/serializers/profile_serializer.py", line 89, in handle_update
    instanced_serializer.save()
  File "/Users/sebito/.virtualenvs/cargoo/lib/python3.6/site-packages/rest_framework/serializers.py", line 209, in save
    self.instance = self.update(self.instance, validated_data)
  File "/Users/sebito/.virtualenvs/cargoo/lib/python3.6/site-packages/rest_framework_mongoengine/serializers.py", line 269, in update
    instance = self.recursive_save(validated_data, instance)
  File "/Users/sebito/.virtualenvs/cargoo/lib/python3.6/site-packages/rest_framework_mongoengine/serializers.py", line 230, in recursive_save
    me_data[key] = field.recursive_save(value)
  File "/Users/sebito/.virtualenvs/cargoo/lib/python3.6/site-packages/rest_framework_mongoengine/serializers.py", line 224, in recursive_save
    for key, value in validated_data.items():
AttributeError: 'NoneType' object has no attribute 'items'

in recursive_save method of DocumentSerializer, it's assumed that validated_data won't be null but it might.

Can you try going with the implicit EmbeddedDocumentSerializer for discount, without creating one of your own? Also, make sure that the versions of libraries are exactly as follows:

django==1.9
djangorestframework==3.3.3
mongoengine==0.9
pymongo==2.7

What do you think about this fix?
sebitoelcheater@16f7bef

I'm also facing the same issue related to the EmbeddedDocumentSerializer and here the value for EmbeddedDocumentSerializer field is an object of model. It returns the error like above:

AttributeError: 'Modelname' object has no attribute 'items'
Any suggestions please.

Package versions:
django == 3.0.4
djangorestframework == 3.11.0
mongoengine == 0.19.1
pymongo == 3.10.1
django-rest-framework-mongoengine == 3.4.1