标签:ima user pat framework 大神 objects des post ica
在使用drf过程中,发现要写大量的serializers、view,在借鉴了各位大神的经验后,简化一下代码
#base/view.py:通用部分 from rest_framework.views import APIView from rest_framework.response import Response class GenericAPIView(APIView): queryset = None serializer_class = None def get(self, request, id=None): return self.retrieve(request, id) def patch(self, request, id=None): return self.update(request, id) def delete(self, request, id=None): return self.destroy(request, id) def get_queryset(self): return self.queryset.all() def get_serializer(self, *args, **kwargs): return self.serializer_class(*args, **kwargs) def retrieve(self, request, id): if not id: queryset = self.get_queryset() ser_obj = self.get_serializer(queryset, many=True) else: ser_obj = self.get_queryset().filter(id=id).first() if not ser_obj: return Response({‘code‘:0,‘msg‘:‘数据不存在!‘}) ser_obj = self.get_serializer(ser_obj) return Response({‘code‘:1,‘data‘:ser_obj.data}) def create(self, request,**kwargs): postdata=request.data.copy()#querydict先copy为可变对象 [postdata.__setitem__(i,kwargs[i]) for i in kwargs] ser_obj = self.get_serializer(data=postdata) if ser_obj.is_valid(): ser_obj.save() return Response({‘code‘:1,‘msg‘:‘创建成功!‘,‘data‘:ser_obj.data}) else: return Response({‘code‘:0,‘msg‘:‘失败!‘,‘data‘:ser_obj.errors}) def update(self, request, id): ser_obj = self.get_queryset().filter(id=id).first() ser_obj = self.get_serializer(instance=ser_obj, data=request.data, partial=True) if ser_obj.is_valid(): ser_obj.save() return Response({‘code‘:1,‘msg‘:‘修改成功!‘}) else: return Response({‘code‘:0,‘msg‘:‘提交失败!‘,‘data‘:ser_obj.errors}) def destroy(self, request, id): ser_obj = self.get_queryset().filter(id=id).first() if ser_obj: ser_obj.delete() return Response({‘code‘:1,‘msg‘:‘删除成功!‘}) else: return Response({‘code‘:0,‘msg‘:‘删除失败,对象不存在!‘})
没有写post写到view里面,设置一些自定义字段
#app/view.py @method_decorator(csrf_exempt,name=‘post‘) class projectView(GenericAPIView): queryset = project.objects.all() serializer_class = ProjectSerializer def post(self,request): return self.create(request,creater=request.user.id)
#serializer.py 按需写就行 class ProjectSerializer(serializers.HyperlinkedModelSerializer): id=serializers.IntegerField(read_only=True) name=serializers.CharField(required=True,allow_blank=False,max_length=200) content=serializers.CharField(max_length=200,required=True,allow_blank=False,) img=serializers.URLField(required=False,) creater=serializers.PrimaryKeyRelatedField(queryset=member.objects.all(),required=False,allow_null=True ) # creater=serializers.SerializerMethodField() class Meta: model=project fields=[‘id‘,‘name‘,‘content‘,‘img‘,‘creater‘]
最后,只需要写serializer和具体业务方法。当然在此基础上还需要扩展,但是已经减少了很多代码了。以后会更新一些扩展示例。
标签:ima user pat framework 大神 objects des post ica
原文地址:https://www.cnblogs.com/rainny/p/13892296.html