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方法。。。