Django одновременное обновление нескольких задач
У меня есть мой Django сайт, где я могу иметь задачи, созданные и подзадачи под задачами у меня есть опция отметить завершенным, которая работает нормально, мне нужно, чтобы они были завершены пакетно, как выбор нескольких задач сразу и их завершение.
serializers.py:
class TaskCompleteSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = (
'is_done',
)
def update(self, instance, validated_data):
person = self.context['request'].user.person
task_is_done = validated_data.get('is_done', False)
if task_is_done:
instance.subtasks.update(is_done=True)
instance.is_done = task_is_done
instance.done_by.set([person])
instance.save()
return instance
views.py:
class TaskUpdateAPIView(UpdateAPIView):
permission_classes = " "
serializer_class = TaskCompleteSerializer
queryset = Task.objects.all()
model = Task
lookup_url_kwarg = 'task_id'
urls.py
path('<int:task_id>/complete/',views.TaskUpdateAPIView.as_view(),
name='task_update'),
models.py
class Task(BaseModel):
name = models.CharField(max_length=255)
done_by = models.ManyToManyField(
User,
related_name='tasks_completed',
blank=True,
)
is_done = models.BooleanField(default=False)
class Subtask(models.Model):
name = models.CharField(max_length=255)
subtask_of = models.ForeignKey(
Task,
related_name='subtasks',
blank=True,
null=True,
on_delete=models.CASCADE,
)
Вы можете использовать bulk_update
for task in tasks:
task.is_done = True
Task.objects.bulk_update(tasks)
Я думаю, что вы можете изменить путь для массового обновления.
В urls.py,
path('<str:task_ids>/complete', views.TaskUpdateAPIView.as_view(),
name='task_update'),
В views.py можно настроить put
метод для запроса обновления.
class TaskUpdateAPIView(UpdateAPIView):
permission_classes = " "
serializer_class = TaskCompleteSerializer
queryset = Task.objects.all()
def put(self, request, task_ids):
id_array = task_ids.split(",")
for id_item in id_array:
try:
task= Task.objects.get(pk=id_item)
task_serializer = self.get_serializer(task, data = request.data)
if task_serializer.is_valid():
task_serializer.save()
except Member.DoesNotExist:
continue
return Response(status=status.HTTP_200_OK)
Во фронтенде, когда вы обновляете один объект, api url должен быть установлен как .../1/complete/
.
При обновлении нескольких объектов, api url может быть .../1,2,3/complete/
.