手动实现django中视图和视图集

import json

from django.forms import forms
from django.http import JsonResponse, HttpResponse
from django.shortcuts import render

# Create your views here.
from django.views import View
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.generics import GenericAPIView, ListAPIView, RetrieveAPIView, CreateAPIView, DestroyAPIView, \
    UpdateAPIView, RetrieveUpdateAPIView, RetrieveUpdateDestroyAPIView
from rest_framework.mixins import ListModelMixin, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, \
    DestroyModelMixin
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet, GenericViewSet

from booktest.forms import BookInfoform
from booktest.models import BookInfo
from booktest.serializers import BookInfoSerializer, BookInfoSerializerModel


class BookaddView(View):
    def get(self, request):
        form = BookInfoform()

        return render(request, 'index.html', {'form': form})

    def post(self, request):
        form = BookInfoform(request.POST)
        req_data = dict()
        if form.is_valid():
            req_data = form.cleaned_data
        # 保存到数据库
        try:
            book = BookInfo.objects.create(btitle=req_data['btitle'],
                                           bpub_date=req_data['bpub_date'],
                                           bread=req_data['bread'],
                                           bcomment=req_data['bcomment'])

        except Exception as e:
            print(e)
        return HttpResponse('ok')


# class BookInfoViewSet(ModelViewSet):
#     queryset = BookInfo.objects.all()
#     serializer_class = BookInfoSerializer

class BookInfoView(APIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializerModel

    def get(self, request):
        books = BookInfo.objects.all()
        serializer = BookInfoSerializerModel(books, many=True)

        return Response(data=serializer.data)

    def post(self, request):
        # 获取传来的数据
        data = request.data  # 默认使用了DRF的request,
        print(data)
        new_book = BookInfoSerializerModel(data=data)
        # 保存到数据库
        if new_book.is_valid():
            new_book.save()
        return Response(data=new_book.data)

    def put(self, request):
        data = request.data
        print(data)
        instance = ''
        new_book = BookInfoSerializerModel(data=data)
        if new_book.is_valid():
            new_book.save()
        return Response(data=new_book.data)

    def patch(self, request):
        pass


class BookInfo_detailGenericAPIView(GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializerModel
    lookup_field = 'btitle'

    # lookup_url_kwarg='btitile'

    def get(self, request, btitle):
        book = self.get_object()
        serializer = self.get_serializer(book)
        return Response(data=serializer.data)

    def put(self, request, btitle):
        book = self.get_object()
        serializer = self.get_serializer(book, data=request.data)
        if serializer.is_valid():
            serializer.save()
        return Response(data=serializer.data)


class BookInfoGenericAPIView(GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializerModel

    def get(self, request):
        books = self.get_queryset()
        serializer = self.get_serializer(books, many=True)
        return Response(data=serializer.data)

    def post(self, request):
        data = request.data
        print(data)
        serializer = self.get_serializer(data=data)
        if serializer.is_valid():
            serializer.save()
        return Response(data=serializer.data)


class BookInfoGenericAPIViewExtends(ListModelMixin, DestroyModelMixin
    , RetrieveModelMixin, UpdateModelMixin
    , CreateModelMixin, GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializerModel
    """ 
    避免ListModelMixin,中的get()与RetrieveModelMixin的get()冲突,
    使用all,来获取所有的记录,单一的记录通过pk获得
    """
    def get(self, request, pk):
        if pk == 'all': # 获取所有的记录
            return self.list(request)
        else:
            return self.retrieve(request, pk) # 获取一条记录

    # def get(self,request):
    #     return self.list(request)

    def post(self, request):
        return self.create(request)

    def put(self, request, pk):
        return self.update(request, pk)

    def delete(self, request, pk):

        return self.destroy(request, pk)


class BookInfoGenericAPIViewHeight(ListAPIView,CreateAPIView
    , RetrieveUpdateDestroyAPIView):
    """
    ListAPIView,
    CreateAPIView
    , RetrieveUpdateDestroyAPIView
    只使用这三个就可以获得GET, POST, PUT, DELETE, HEAD, OPTIONS所有请求方式
    """
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializerModel


class BookInfoViewset(viewsets.ViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializerModel

    def list(self,reuqest):

        serializer = BookInfoSerializerModel(self.queryset,many=True)
        return Response(data=serializer.data)

    def create(self,request):
        data= request.data
        serializer=BookInfoSerializerModel(data=data)
        if serializer.is_valid():
            serializer.save()
        return Response(data=serializer.data)

    def update(self,request,pk):
        instance=None
        data=request.data
        #
        # data=json.loads(data)
        try:
            instance=BookInfo.objects.get(id=pk)
        except Exception as e:
            print(e)
        if not instance:
            return Response(data='查询出错')
        # instance.btitle=request.data.get('btitle',instance.btitle)
        # instance.bpub_date=request.data.get('bpub_date',instance.bpub_date)
        # instance.bread=request.data.get('bread',instance.bread)
        # instance.bcomment=request.data.get('bcomment',instance.bcomment)
        # instance.is_delete=request.data.get('is_delete',instance.is_delete)
        # instance.bimage=request.data.get('bimage',instance.bimage)
        # instance.save()
        serializer=BookInfoSerializerModel(instance,data=data)
        if serializer.is_valid():
            serializer.save()
        return Response(data=instance)

    def retrieve(self,request,pk):
        instance = None
        try:
            instance = BookInfo.objects.get(id=pk)
        except Exception as e:
            print(e)
        if not instance:
            return Response(data='查询出错')
        serializer = BookInfoSerializerModel(instance)

        return Response(data=serializer.data)

    def destroy(self,request,pk):
        instance = None
        try:
            instance = BookInfo.objects.get(id=pk)
        except Exception as e:
            print(e)
        if not instance:
            return Response(data='查询出错')
        instance.delete()
        return Response(data='删除成功')


class BookInfoGenericViewset(GenericViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializerModel
    def list(self,reuqest):
        books=self.get_queryset()
        serializer = self.get_serializer(books,many=True)
        return Response(data=serializer.data)

    def create(self,request):
        data=request.data
        serializer=self.get_serializer(data=data)
        if serializer.is_valid():
            serializer.save()
        return Response(data=serializer.data)

    def update(self,request,pk):
        # instance=None
        data=request.data
        instance=self.get_object()
        serializer=self.get_serializer(instance,data=data)
        if serializer.is_valid():
            serializer.save()
        return Response(data=serializer.data)

    def retrieve(self,request,pk):
        instance = self.get_object()

        serializer = BookInfoSerializerModel(instance)

        return Response(data=serializer.data)

    def destroy(self,request,pk):
        instance = self.get_object()
        instance.delete()
        return Response(data='删除成功')

    @action(methods=['get'],detail=False)
    def latest(self,request):
        book=BookInfo.objects.latest('id')
        serializer=self.get_serializer(book)
        return Response(data=serializer.data)

    @action(methods=['put'], detail=True)
    def read(self, request, pk):
        """
        修改图书的阅读量数据
        """
        book = self.get_object()
        book.bread = request.data.get('bread')
        book.save()
        serializer = self.get_serializer(book)
        return Response(serializer.data)

猜你喜欢

转载自blog.csdn.net/wu0che28/article/details/81074943
今日推荐