DRF 批量删除(ListField的使用)

前言

DRF视图集中,viewsets帮我们实现了list retrieve created update delete 操作

我在开发博客后台接口的时候,需要批量删除。django生成的后台管理中,也有这样的操作。

先获取数据列表,选择对应的数据列表,点击删除,即可批量删除了。

image.png

本文就以实现批量删除功能,来理解listfield

流程

设置接口

后端需要知道删除哪些数据,所以必须给前端一个接口,而且必须要把待删除数据的信息传到后端

view.py

class AttachmentViewSet(viewsets.ModelViewSet):
    queryset = AttachmentModel.objects.all()
    serializer_class = DeleteAttachmentsSerializer
    
    # ...
    def get_serializer_class(self):
        if self.action == "delete_multiple":
            serializer_class = DeleteAttachmentsSerializer

    @action(methods=['delete'], detail=False)
    def delete_multiple(self, request, *args, **kwargs):
        """批量删除或删除单个"""
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        delete_list = serializer.validated_data['pending_deletion']
        self.get_queryset().filter(id__in=delete_list).delete()
        return Response(serializer.data, status=status.HTTP_204_NO_CONTENT)

这里定义了个delete_multiple方法, 这就是用于批量删除的方法

再注册视图类到路由中,这步就省略不写了

序列化类

目前已经有了批量删除的接口, 而我们需要拿到被要求删除的id值, 所以接口还需要一个字段

serializer.py

class DeleteAttachmentsSerializer(serializers.Serializer):
    # delete_list = ListOrItemField(serializers.CharField(max_length=10))
    pending_deletion = serializers.ListField(child=serializers.IntegerField())

    def create(self, validated_data):
        pass

    def update(self, instance, validated_data):
        pass

定义了一个pending_deletion字段, 字段类型就是ListField

前端请求

  • 删除一条数据
{
  'pending_deletion': 10
}

在本例中, 这将主键Id值为10的数据

  • 删除多条数据
{
  'pending_deletion': 10,
  'pending_deletion': 20,
  'pending_deletion': 30
}

这将删除主键id为10, 20, 30的数据

我原本以为,会像python字典那样的书写格式, 是我想多了,所以一直不太理解这个ListField的使用

{

​ 'pending_deletion': '[10,20,30]'

}

接收列表数据

delete_list = serializer.validated_data['pending_deletion']

在视图函数中, 从序列化对象的validated_data取出数据, 这里数据类型就是列表类型

得到一个列表: [10, 20, 30]

删除数据

通过查询集条件筛选delete即可

复合字段

ListField 被称为复合字段, 与之类似的还有DictField HStoreField JSONField

官方文档: https://www.django-rest-framework.org/api-guide/fields/#composite-fields

添加新评论