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,這是最基本的用法。