返回顶部

DRF之视图

一. 简介

直接上图:

 

 

1. 用法

urls:


from django.urls import path
from xuliehua.views import BookView, BookEditView,BookModelViewSet


urlpatterns = [

# path('list/', BookView.as_view()),
# path('retrieve/<int:pk>/', BookEditView.as_view())
path('list/', BookModelViewSet.as_view({'get':'list', 'post': 'create'})),
path('retrieve/<int:pk>/', BookModelViewSet.as_view({'get':'retrieve', 'put': 'update', 'delete': 'destroy'}))
]

views: 具备增删改查功能

from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response
from xuliehua import models
from xuliehua.serializers import BookModelSerializer


class BookModelViewSet(ModelViewSet):
    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer

BookModelSerializer:

class BookModelSerializer(serializers.ModelSerializer):

    category_display = serializers.CharField(source='get_category_display',read_only=True)
    publisher_info = serializers.SerializerMethodField(read_only=True)
    authors = serializers.SerializerMethodField(read_only=True)

    def get_publisher_info(self, obj):
        publish_obj = obj.publisher
        return {'id':publish_obj.pk, 'title': publish_obj.title}

    def get_authors(self, obj):
        author_queryset = obj.author.all()
        return [{'id': author.pk, 'name': author.name}  for author in author_queryset]

    def validate_title(self, value):
        if 'python' not in value.lower():
            raise serializers.ValidationError('标题必须含有python')
        return value

    class Meta:
        model = models.Book
        fields = '__all__'
        extra_kwargs = {'category':{'write_only':True}, 'publisher': {'write_only': True}, 'author': {'write_only':True}}

总结:

1.直接继承API,适用于非ORM简单操作,需要自定义功能时,用他。

class TestView(APIView):
    def get(self,request,*args,**kwargs):
        pass

2. 继承ListAPIView,DestroyAPIView,UpdateAPIView,RetrieveAPIView,CreateAPIView,项目中只要实现某几个接口时,而不是增删改查。


from rest_framework.generics import ListAPIView,CreateAPIView
class CourseView(ListAPIView,CreateAPIView):
     queryset = models.Course.objects.all()
     serializer_class = CourseSerializers

3. 继承ModelViewSet,功能中需要实现对表的增删改查时。记住,还要修改路由:


from rest_framework.viewsets import ModelViewSet
class CourseView(ModelViewSet):
    queryset = models.Course.objects.all()
    serializer_class = CourseSerializers

 举例:

path('depart/', DepartView.as_view({'get': 'list', 'post': 'create'})),
path('depart/<int:pk>/', DepartView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy','patch': 'partial_update'})),

 

特别注意一种情况,想要在一个类中实现单条数据的查看和查看所有数据:应该这么继承和写url:

from rest_framework.mixins import ListModelMixin,RetrieveModelMixin
from rest_framework.viewsets import GenericViewSet

 

 如果只是继承 ListAPIView 和  RetrieveAPIView那么,永远都只是返回所有数据,原因是都是用的第一个继承的get方法。。。

posted @ 2020-10-14 17:11  muguangrui  阅读(41)  评论(0编辑  收藏  举报