django rest framework案例

#models.py
from django.db import models


# Create your models here.

class Tag(models.Model):
    """
    标签表
    """
    caption = models.CharField(verbose_name='标签', max_length=32)


class Course(models.Model):
    """
    课程表
    """
    title = models.CharField(verbose_name='课程名称', max_length=32)


class Module(models.Model):
    """
    模块表
    """
    level_choices = (
        (1, '初级'),
        (2, '中级'),
        (3, '高级'),
    )
    level = models.IntegerField(verbose_name='级别', choices=level_choices, default=1)
    name = models.CharField(verbose_name='模块名称', max_length=32)
    course = models.ForeignKey(to='Course', verbose_name='课程', on_delete=models.CASCADE)


class Video(models.Model):
    """
    视频表
    """
    title = models.CharField(verbose_name='视频名称', max_length=32)
    vid = models.CharField(verbose_name='视频id', max_length=64)
    tag = models.ManyToManyField(verbose_name='标签', to='Tag')

#urls.py
from django.urls import path, re_path, include
from drf import views
from rest_framework import routers

router = routers.DefaultRouter()
router.register('drf11', views.Drf11)

urlpatterns = [
    path('index/', views.index, name='index'),

    re_path('^drf01/(?P<version>w+)/$', views.Drf01.as_view(), name='drf01'),

    path('drf02/', views.Drf02.as_view(), name='drf02'),

    path('drf03/', views.Drf03.as_view(), name='drf03'),

    path('drf04/', views.Drf04.as_view(), name='drf04'),

    path('drf05/', views.Drf05.as_view({'get': 'list', 'post': 'create'}), name='drf05'),
    re_path('^drf05/(?P<pk>d+)/$',
            views.Drf05.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy', 'patch': 'partial_update'}),
            name='drf05'),

    path('drf06/', views.Drf06.as_view({'get': 'list', 'post': 'create'}), name='drf06'),
    re_path('^drf06/(?P<pk>d+)/$',
            views.Drf06.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy', 'patch': 'partial_update'}),
            name='drf06'),

    path('drf07/', views.Drf07.as_view(), name='drf07'),

    re_path('^drf08/(?P<pk>d+)/$', views.Drf08.as_view(), name='drf08'),
    path('drf08/', views.Drf08.as_view(), name='drf08'),

    re_path('^drf09/(?P<pk>d+)/$',
            views.Drf09.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy', 'patch': 'partial_update'}),
            name='drf09'),
    path('drf09/', views.Drf09.as_view({'get': 'list', 'post': 'create'}), name='drf09'),

    path('drf10/', views.Drf10.as_view(), name='drf10'),
    re_path('^drf10/(?P<pk>d+)/$', views.Drf10.as_view(), name='drf10'),

    path('', include(router.urls)),

    path('drf12/', views.Drf12.as_view(), name='drf12'),
    re_path('^drf12/(?P<pk>d+)/$', views.Drf12.as_view(), name='drf12'),

]
#views.py
from django.shortcuts import render
from django.http import HttpResponse
from rest_framework.views import APIView
from rest_framework.generics import ListAPIView, CreateAPIView, RetrieveAPIView
from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response
from rest_framework.versioning import URLPathVersioning
from drf import ser, models


def index(request):
    return HttpResponse('ok')

#接口返回一个字符串含有版本。
class Drf01(APIView):
    versioning_class = URLPathVersioning

    def get(self, request, *args, **kwargs):
        data = {'version': request.version}
        return Response(data=data)

#接口返回一个xml文件的内容。
class Drf02(APIView):
    def get(self, request, *args, **kwargs):
        with open('drf/templates/abc.xml') as f:
            xml = f.read()
        # print(xml)
        return Response(data=xml)

#接口基于APIView实现对课程表的获取所有数据,增加数据。
class Drf03(APIView):
    def get(self, request, *args, **kwargs):
        result = {'status': True, 'data': {}, 'error': {}}
        querset = models.Course.objects.all()
        seri = ser.CourseSerializer(instance=querset, many=True)
        result['data'] = seri.data
        return Response(data=result)

    def post(self, request, *args, **kwargs):
        result = {'status': True, 'data': {}, 'error': {}}
        seri = ser.CourseSerializer(data=request.data)
        if seri.is_valid():
            seri.save()
        else:
            result['status'] = False
            result['error'] = seri.errors
        return Response(result)

#接口基于ListAPIView、CreateAPIView获取所有数据,增加数据。
class Drf04(ListAPIView, CreateAPIView):
    queryset = models.Course.objects.all()
    serializer_class = ser.CourseSerializer

#接口对Course表实现增删改查。
class Drf05(ModelViewSet):
    queryset = models.Course.objects.all()
    serializer_class = ser.CourseSerializer

#接口对Course表实现增删改查,列表页面的功能不去数据库获取,而去文件中获取。
class Drf06(ModelViewSet):
    queryset = models.Course.objects.all()
    serializer_class = ser.CourseSerializer

    def list(self, *args, **kwargs):
        with open('drf/file/course.txt') as f:
            data = f.read()
        return Response(data=data)

#接口基于APIView+serializer实现对模块表获取数据。显示数据,只显示id和name,只显示id、name、课程名称,只显示id、name、级别名称、课程名称。
class Drf07(APIView):
    def get(self, *args, **kwargs):
        querset = models.Module.objects.all()
        seri = ser.ModuleSerializer(instance=querset, many=True)
        return Response(seri.data)

#接口基于RetrieveAPIView, CreateAPIView实现对module表的单条数据展示、增加。
class Drf08(RetrieveAPIView, CreateAPIView):
    queryset = models.Module.objects.all()
    serializer_class = ser.ModuleSerializer

#接口基于ModelViewSet实现对Module表增删改查。
class Drf09(ModelViewSet):
    queryset = models.Module.objects.all()
    serializer_class = ser.Module09Serializer

#接口实现对Video表获取视频列表,单条视频信息。
class Drf10(RetrieveAPIView, ListAPIView):
    queryset = models.Video.objects.all()
    serializer_class = ser.VideoSerializer

#接口实现对Video表增删改查。多对多操作实现tag名称。
class Drf11(ModelViewSet):
    queryset = models.Video.objects.all()
    serializer_class = ser.Video11Serializer


class Drf12(ListAPIView, RetrieveAPIView):
    queryset = models.Module.objects.all()
    serializer_class = ser.Module09Serializer

#ser.py
from rest_framework import serializers
from drf import models


class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Course
        fields = '__all__'


class ModuleSerializer(serializers.ModelSerializer):
    course_name = serializers.CharField(source='course.title')
    level_text = serializers.CharField(source='get_level_display')

    class Meta:
        model = models.Module
        # fields='__all__'
        # exclude = ['course']
        fields = ['id', 'name', 'level_text', 'course_name']


class Module09Serializer(serializers.ModelSerializer):
    class Meta:
        model = models.Module
        fields = '__all__'


class VideoSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Video
        fields = '__all__'


class Video11Serializer(serializers.ModelSerializer):
    tag_txt = serializers.SerializerMethodField()

    class Meta:
        model = models.Video
        fields = ['id', 'title', 'vid', 'tag', 'tag_txt']

    def get_tag_txt(self, obj):
        tag_list = obj.tag.all()
        return [row.caption for row in tag_list]

原文地址:https://www.cnblogs.com/dech/p/14396222.html