Django一次多重更新任务

发布于 2025-02-02 05:50:21 字数 1572 浏览 2 评论 0原文

我拥有我的Django网站,可以在其中创建任务,并在任务下进行子任务,我的标记完整选项正常,我需要在批处理中完成它们,例如一次选择多个任务并完成它们。

serializer.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'),

型号

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,
)
    

I have my Django website where i can have tasks created and subtasks under tasks i have mark complete option which is working fine i need them to be completed in batch like selecting multiple tasks at once and complete them.

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,
)
    

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

新一帅帅 2025-02-09 05:50:21

我认为您可以改变批量更新的路径。

在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/完整/

当您更新多个对象时,API URL可以是.../1,2,3/完整/

I think you can change the path for bulk update.

In urls.py,

path('<str:task_ids>/complete', views.TaskUpdateAPIView.as_view(), 
name='task_update'),

And in views.py, you can customize put method for update request.

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)
     

In frontend, when you update one object, the api url should be set like .../1/complete/.

When you update multiple objects, the api url can be .../1,2,3/complete/.

冷情妓 2025-02-09 05:50:21

您可以使用bulk_update

for task in tasks:
    task.is_done = True
Task.objects.bulk_update(tasks)

You can use bulk_update

for task in tasks:
    task.is_done = True
Task.objects.bulk_update(tasks)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文