在 Django Rest Framework 中批量更新数据

Posted

技术标签:

【中文标题】在 Django Rest Framework 中批量更新数据【英文标题】:Bulk Update data in Django Rest Framework 【发布时间】:2018-06-02 19:54:24 【问题描述】:

我正在通过 Django Rest Framework 创建一个通知应用程序,用户可以在前端使用 PATCH API 标记为已读通知。如何批量更新数据才能完成这项任务。

下面的这个序列化程序和视图集仅用于 PATCH 一个通知对象,但我想使用具有字段 is_read = False 的通知来完成这一切

用正确的方式编辑

我的序列化器:

class NotificationEditSerializer(ModelSerializer):
    class Meta:
        model = Notification
        fields = (
            'id',
            'is_read'
        )

我的视图集:

from rest_framework.response import Response
class NotificationListAPIView(ReadOnlyModelViewSet):
    queryset = Notification.objects.all()
    permission_classes = [AllowAny]
    serializer_class = NotificationEditSerializer
    lookup_field = 'id'

    @list_route(methods=['PATCH'])
    def read_all(self, request):
        qs = Notification.objects.filter(is_read=False)
        qs.update(is_read=True)
        serializer = self.get_serializer(qs, many=True)
        return Response(serializer.data)

我的网址:

from rest_framework import routers
router.register(r'notifications/read_all', NotificationListAPIView)

【问题讨论】:

【参考方案1】:

您可以尝试使用list_route,例如:

from rest_framework.response import Response
from rest_framework.decorators import list_route

class NotificationListAPIView(ReadOnlyModelViewSet):
    #YOUR PARAMS HERE

    @list_route()
    def read_all(self, request):
        qs = Notification.objects.filter(is_read=False)
        qs.update(is_read=True)
        serializer = self.get_serializer(qs, many=True)
        return Response(serializer.data)

该 API 可通过 ^YOUCURRENTURL/read_all/$ 获得更多详细信息 marking-extra-actions-for-routing

【讨论】:

收到此错误:预期视图 NotificationEditAPIView 将使用名为“id”的 URL 关键字参数调用。修正您的 URL 配置,或正确设置视图上的 .lookup_field 属性。 这是我的新 URL 配置:url(r'^read_all/$', NotificationEditAPIView.as_view(), name='list'), 你不需要更改 url 配置,只需按旧方式列出前缀 url(r'^(?P[0-9]+)/mark_as_read/$', NotificationEditAPIView.as_view(), name='list') 只针对一个对象,但我想要更新所有对象,Brown。 为什么要使用RetrieveUpdateAPIView 列表为什么(例如)不使用ReadOnlyModelViewSet

以上是关于在 Django Rest Framework 中批量更新数据的主要内容,如果未能解决你的问题,请参考以下文章

django使用rest_framework

Django Rest Framework

Django rest framework 身份和权限验证

Django Rest Framework:非模型服务

django-rest-framework - 在可浏览的 API 中自动生成表单?

在 django-rest-framework 中,是不是可以同时使用 oauth 和 session 身份验证?