前言
DRF视图集中,viewsets帮我们实现了list
retrieve
created
update
delete
操作
我在开发博客后台接口的时候,需要批量删除。django生成的后台管理中,也有这样的操作。
先获取数据列表,选择对应的数据列表,点击删除,即可批量删除了。
本文就以实现批量删除功能,来理解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