Put request Set и Push в одном запросе Django MongoEngine MongoDB

Я хочу отправить запрос put и обновить поле Project(Document) name и поле attendees в одном запросе put. Но я не хочу, чтобы все посетители Project(Document) были заменены, я хочу, чтобы строковые поля были заменены новым значением, а поля списка были помещены в массив/список. Как я могу этого добиться? На данный момент мне всегда требуется несколько запросов (по одному на каждое отдельное поле списка), что очень утомительно, так как в моей реальной модели гораздо больше полей для обновления. И я думаю, что давать фронтэнду полный Project и управлять полями списка там (нажимая на них во фронтэнде) было бы небезопасно. Вы же не хотите, чтобы фронтенд мог их изменять. Я также хочу, чтобы метка времени автоматически добавлялась к Attendee, если участник был добавлен в список / массив.

Модели

class Attendee(EmbeddedDocument):
    full_name = fields.StringField()
    datetime_added = fields.DateTimeField(
        auto_now_add=True, default=datetime.datetime.utcnow)

class Project(Document):
    name = fields.StringField()
    tags = fields.ListField(fields.StringField())
    attendees = fields.ListField(fields.EmbeddedDocumentField(Attendee))

Виды

class ProjectViewSet(viewsets.ModelViewSet):
    """
    List all projects or create, update or delete project.
    """
    permission_classes = [  # Set authentication
        # permissions.IsAuthenticated
        permissions.IsAdminUser
        # permissions.AllowAny
    ]
    lookup_field = 'id'
    queryset = Project.objects.all()
    serializer_class = ProjectSerializer

    def partial_update(self, request, id):
        print("REQUEST PUT PROJECT ID:", id)
        project = Project.objects.get(id=id)
        serializer = ProjectSerializer(
            project, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Виды для передачи в массив моделей

@api_view(["PUT", "DELETE", ])
@permission_classes([IsAdminUser])
def attendee(request, **kwargs):
    """
    PUT or DELETE attendees for project
    """

    if request.method == "PUT":
        """
        ADD ATTENDEE
        """

        # Get project
        project_id = kwargs['id']
        # print("PUT ATTENDEE", request.data, project_id)
        project = Project.objects.get(id=project_id)

        if not project:
            return Response({"error": "Project not found"}, status=status.HTTP_400_BAD_REQUEST)

        # Get user id from request body
        attendee_data = request.data

        # Add user to project attendees
        # comment = Comments(content='test', writer='hide')
        if not attendee_data in project.attendees:
            attendee = Attendee(**attendee_data)
            project.attendees.append(attendee)
            # Save full project
            project.save()

            return Response(status=status.HTTP_201_CREATED)
        else:
            return Response({"error": "Attendee already exists"}, status=status.HTTP_400_BAD_REQUEST)
Вернуться на верх