Reputation: 1
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
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