Henrique Hartmann
Henrique Hartmann

Reputation: 1

How to define a correctly .create() method for Django-Rest-Framework with mongoengine in nested serializers

I am sending an API post request with the following in the request body to be serialized as the EventSerializer document with owners persisted as a list of embedded documents:

{
 "name": "string",
 "name_english": "string",
 "starts_on": "2020-05-21T18:46:05.049Z",
 "ends_on": "2020-05-21T18:46:05.049Z",
 "local": "string",
 "description": "string",
 "owners": [
    {
      "first_name": "string",
      "last_name": "string",
      "email": "[email protected]",
      "id": "5ec6dd64d581f76fbfad60eb"
    }
  ]
}

models.py:

class UserRef(EmbeddedDocument):

  id = fields.ReferenceField(User, required=True)
  first_name = fields.StringField(max_length=255, required=True)
  last_name = fields.StringField(max_length=255, required=True)
  email = fields.EmailField(max_length=255, required=True)

class Event(Document):

  name = fields.StringField(max_length=255, required=True)
  name_english = fields.StringField(max_length=255, required=True)
  starts_on = fields.DateTimeField(required=True)
  ends_on = fields.DateTimeField(required=True)
  local = fields.StringField(max_length=255, required=True)
  description = fields.StringField(max_length=255, required=True)
  owners = fields.EmbeddedDocumentListField(UserRef, required=False)

serializers.py:

class UserRefSerializer(serializers.EmbeddedDocumentSerializer):
  class Meta:
      model = UserRef

class EventSerializer(serializers.DocumentSerializer):
  owners = UserRefSerializer(many=True)

  class Meta:
      ref_name = "Event"
      model = Event
      fields = ["id", "name", "name_english", "starts_on", "ends_on", "local", "description", "owners"]

  def create(self, validated_data):
      owners_data = validated_data.pop("owners")
      event = Event.objects.create(**validated_data)
      event.owners = []

      for owner_data in owners_data:
          event.owners.append(owner_data)

      event.save()
      return event

views.py:

class EventViewSet(viewsets.ModelViewSet):
  queryset = Event.objects.all()
  serializer_class = EventSerializer

When I run the post request, the Event object does get persisted; however, the owners list (a list of embedded documents) is not persisted inside the Event. It's just set to a blank list [ ]. What am I doing wrong here?

Upvotes: 0

Views: 206

Answers (1)

Andres Cendales
Andres Cendales

Reputation: 23

You have to instance owner model in the for. Try this:

def create(self, validated_data):
  owners_data = validated_data.pop("owners")
  event = Event.objects.create(**validated_data)
  event.owners = []

  for owner_data in owners_data:
      event.owners.append(UserRef(**owner_data))

  event.save()
  return event

Upvotes: 1

Related Questions