Djano之写api使用django_rest_framework【海瑞博客】

使用django rest framework 可以更快速和友好的编写api,当然网上有很多教程,对于高手来说相对很简单,对于新手来说,根本搞不明白。那是你没有搞明白你自己的职责,做为后端,我们只要提供接口即可,根据提供的参数,对于返回数据。所以,我们需要友好的返回数据并有说明。

官方网站:

http://www.django-rest-framework.org/

中文教程:

Django-REST-framework教程中文版.pdf

OK 开始学习吧!

1478859417993.jpg

首先Model 

class Disk(models.Model):
    """
    """
    identify = models.CharField(max_length=64)
    description = models.CharField(max_length=64, default=u'500G*2')
    orgid = models.CharField(max_length=24)

    def __unicode__(self):
        return "%s" % self.description

    class Meta:
        unique_together = ('identify', 'orgid')

urls写法

from rest_framework import routers
from django.conf.urls import url, include

# 创建路由对象
router = routers.DefaultRouter()
# 将url 注册到路由对象中
router.register(r'assets/(?P<orgid>d+)', views.AssetViewSet)

# 第一个url 就是我们正常的就可以了,后面2个必须是这种写法,一个字都不能错的
urlpatterns = [
    url(r'^assets/(?P<orgid>d+)/upload$', fileviews.AssetUploadViewSet.as_view()),
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]

创建一个serializers.py

from rest_framework import serializers
from models import Disk


class DiskSerializer(serializers.ModelSerializer):
    def validate(self, data):
        """
        数据验证并保证数据的一致性
        """
        if not data['identify'] or not data['orgid']:
            raise serializers.ValidationError("Must have fields: identify, orgid")

        if data['identify']:
            if Disk.objects.filter(identify=data['identify'], orgid=data['orgid']):
                raise serializers.ValidationError("Data is duplicated")
        return data

    def create(self, validated_data):
        ‘’‘新建’‘’
        disk_obj = Disk.objects.create(**validated_data)
        return disk_obj

    def update(self, instance, validated_data):
        '''更新'''
        instance.identify = validated_data.get('identify', instance.identify)
        instance.description = validated_data.get('description', instance.description)
        instance.orgid = validated_data.get('orgid', instance.orgid)
        instance.save()

        return instance

    class Meta:
        model = Disk
        fields = "__all__"

views写法

from django.shortcuts import render, get_object_or_404, get_list_or_404
from rest_framework import generics, viewsets
from rest_framework.response import Response
from rest_framework import permissions
from models import Disk
from serializers import DiskSerializer



class DiskViewSet(viewsets.ModelViewSet):
    """
    硬盘的views
    """
    queryset = Disk.objects.all()
    serializer_class = DiskSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

    def list(self, request, *args, **kwargs):
        '''
        返回所有数据列表,get
        '''
        orgid = self.kwargs['orgid']
        self.queryset = Disk.objects.filter(orgid=orgid)
        serializer = DiskSerializer(self.queryset, many=True)
        return Response({
            "status": 0,
            "data": serializer.data,
            "msg": ""
        })

    def retrieve(self, request, *args, **kwargs):
        '''条件查询'''
        orgid = self.kwargs['orgid']
        pk = self.kwargs['pk']
        liaison = get_object_or_404(self.queryset, identify=pk, orgid=orgid)
        serializer = DiskSerializer(liaison)

        return Response({
            "status": 0,
            "data": serializer.data,
            "msg": ""
        })

    def create(self, request, *args, **kwargs):
        '''创建数据列表 post的时候走此方法'''
        orgid = self.kwargs['orgid']
        request.data.update({'orgid': orgid})
        if Disk.objects.filter(identify=request.data['identify'], orgid=orgid).count() == 0:
            serializer = DiskSerializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            self.perform_update(serializer)
            return Response({
                "status": 0,
                "data": "",
                "msg": "create Disk liaison success"
            })
        return Response({
            "status": 1,
            "data": "",
            "msg": " Disk liaison existed"
        })

    def update(self, request, *args, **kwargs):
        '''更新数据,put'''
        partial = kwargs.pop('partial', False)
        orgid = self.kwargs['orgid']
        pk = self.kwargs['pk']
        instance = get_object_or_404(self.queryset, identify=pk, orgid=orgid)
        serializer = self.get_serializer(instance, request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        return Response({
            "status": 0,
            "data": serializer.data,
            "msg": ""
        })

    def destroy(self, request, *args, **kwargs):
        '''数据'''
        partial = kwargs.pop('partial', False)
        orgid = self.kwargs['orgid']
        pk = self.kwargs['pk']
        instance = get_object_or_404(self.queryset, identify=pk, orgid=orgid)
        self.perform_destroy(instance)

        return Response({
            "status": 0,
            "data": "",
            "msg": "delete Memory liaison success"
        })

我们来说说我们关心的问题

第一:我们get带的参数去哪去取?

    在get请求都是获取数据,那我们传的数据都在request对象中,request与Django自己的不一样,rest的request将数据封装到了 request.query_params,属性中,可以使用get获取。

第二:url的参数动态值怎么取?

    在请求中,我们传的值都在**kwargs里,直接获取即可,记得用get。

想查看更多内容,请访问 http://www.hairuinet.com

From Hairui 转载请注明出处!谢谢
原文地址:https://www.cnblogs.com/hairuipython/p/7053726.html