django是一个神奇的框架,而restframework又是遵循了这个框架的另外一个神奇的框架,然而因为restframework的文档稀烂无比,不少时候你必须看源码才能写出科学的代码,这挡住了不少新手的路。python
要用好restframework你必须对django或者说python的几个概念有比较深入的理解,GenericView,Mixin,子类父类集成调用,多继承时的调用顺序等等,这是用好restframework的第一步。django
Django REST framework的各类技巧【目录索引】json
REST是一种标准,restful是一种规范,根据产品需求须要定出一份方便先后端的规范,所以不是全部的标准要求都须要遵循。segmentfault
文档先丢上api
其实就是写几个东西,就能够快速的实现api缓存
继承某个GenericView,重写里面的某个方法,最大的是get、post、put、patch、delete这些方法,然而并不推荐(应该重写mixin里面的方法)restful
实现一个serilizer,json化response框架
写一个urlpost
每一个项目总有第一我的作基础构架,这个时候就不是仅仅实现一个api就ok了,你须要考虑跟多的事情,包括
统一的异常处理
api权限
统一的参数校验
缓存如何能够作的更简单统一
认证
统一的查询过滤
代码分层
继承某个Genricview,重写对应方法
class CoursesView(ListCreateAPIView): filter_backends = (SchoolPermissionFilterBackend, filters.DjangoFilterBackend, filters.SearchFilter) permission_classes = (IsAuthenticated, ModulePermission) queryset = Course.objects.filter(is_active=True).order_by('-id') filter_fields = ('term',) search_fields = ('name', 'teacher', 'school__name') module_perms = ['course.course'] def get_serializer_class(self): if self.request.method in SAFE_METHODS: return CourseFullMessageSerializer else: return CourseSerializer def get_queryset(self): return Course.objects.select_related('school', ).filter( is_active=True, school__is_active=True, term__is_active=True).order_by('-id') @POST('school', validators='required') def create(self, request, school, *args, **kwargs): if not SchoolPermissionFilterBackend().has_school_permission(request.user, school): raise Error(errors.PermissionDenied, err_message=u'没有对应学校的权限', message=u'没有对应学校的权限') serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return Response(CourseFullMessageSerializer(serializer.instance).data, status=status.HTTP_201_CREATED, headers=headers)
实现一个serilizer,json化response
class CourseSerializer(serializers.ModelSerializer): class Meta: model = Course read_only_fields = ('is_active',) class CourseFullMessageSerializer(CourseSerializer): school = SchoolLittleMessageSerializer() term = serializers.CharField(source='term.name', read_only=True)
写一个url
url(r'^courses/$', CoursesView.as_view(), name='course-list'),
按照这个流程你能够迅速实现大量的api,这是最基本的用法。