在 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'^(?PRetrieveUpdateAPIView
列表为什么(例如)不使用ReadOnlyModelViewSet
以上是关于在 Django Rest Framework 中批量更新数据的主要内容,如果未能解决你的问题,请参考以下文章