1. 程式人生 > >DRF之路由系統與視圖

DRF之路由系統與視圖

.com post 請求 新增 手動 sta date 區分 elf

手動路由編寫

# 路由
from django.conf.urls import url
from app01.views import UserListView


urlpatterns = [
    # GET請求 查詢所有
    # POST請求 增加
    url(r'^users/$', UserListView.as_view()),
    url(r'^users\.(?P<format>\w+)/$', UserListView.as_view()),  # 附帶.json後綴

    # PUT請求 修改
    # DELETE請求 刪除
    # GET請求 查詢單個數據
    url(r'^users/(?P<pk>\d+)/$', UserListView.as_view()),
    url(r'^users\.(?P<format>\w+)/(?P<pk>\d+)/$', UserListView.as_view()),
]



# 視圖
from rest_framework import serializers
from .models import UserInfo
from rest_framework.response import Response

class MySerializer (serializers.ModelSerializer):

    class Meta:
        model = UserInfo  # 指定model
        fields = '__all__'  # 自動生成所有字段
        depth = 2  # 對於外鍵字段,可以顯示


class UserListView(APIView):
    def get(self,request,*args,**kwargs):
        print(args)
        print(kwargs)
        # 區分查詢 單個 或 所有數據
        pk = kwargs.get('pk','')
        if pk:
            obj = UserInfo.objects.filter(id=pk).first()
            ser = MySerializer(instance=obj, many=False)
        else:
            obj_list = UserInfo.objects.all()
            ser = MySerializer(instance=obj_list, many=True)
        return Response(ser.data)

    def post(self,request,*args,**kwargs):
        # 新增
        pass

    def put(self,request,*args,**kwargs):
        # 更新
        pass

    def delete(self,request,*args,**kwargs):
        # 刪除
        pass

半自動路由與視圖

# 路由

from django.conf.urls import url
from django.contrib import admin
from app01.views import UserViewSet


urlpatterns = [
    url(r'^admin/', admin.site.urls),

    #  以get方式提交,則調用list方法;以post方式提交,則調用create方法
    url(r'^test/$', UserViewSet.as_view({'get': 'list', 'post': 'create'})),
    
    url(r'^test/(?P<pk>\d+)/$', UserViewSet.as_view(
        {'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'})),
]


# 視圖
from rest_framework.viewsets import ModelViewSet
from rest_framework import serializers


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserInfo
        fields = "__all__"


class UserViewSet(ModelViewSet):
    queryset = UserInfo.objects.all()
    serializer_class = UserSerializer

視圖繼承關系圖

技術分享圖片

DRF提供了可以直接在頁面進行 新增修改刪除 等功能:

技術分享圖片


全自動路由與視圖

# 路由
from django.conf.urls import url, include
from rest_framework import routers


router = routers.DefaultRouter()
router.register(r'users', UserViewSet)

urlpatterns = [
    url(r'^', include(router.urls)),
]



# 視圖
from rest_framework.viewsets import ModelViewSet
from rest_framework import serializers


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserInfo
        fields = "__all__"


class UserViewSet(ModelViewSet):
    queryset = UserInfo.objects.all()
    serializer_class = UserSerializer

DRF之路由系統與視圖