Как правильно определить метод .create () для Django -Rest-Framework с mongoengine во вложенных сериализаторах - PullRequest
0 голосов
/ 26 мая 2020

Я отправляю запрос на публикацию API со следующим текстом в теле запроса для сериализации в виде документа EventSerializer, владельцы которого сохраняются в виде списка встроенных документов:

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

Когда я запускаю почтовый запрос, объект Event сохраняется; однако список владельцев (список встроенных документов) не сохраняется внутри события. Это просто пустой список []. Что я здесь делаю не так?

...