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)