#生成序列化对象
class  BookModelSerizter(serializers.ModelSerializer):   
   class Meta:
         model=Book
         fields='__all__'
    ##下面相当于是加个连接url,当你访问那个url的时候,就进行反向解析这个url
        # author = serializers.HyperlinkedIdentityField(
        #     view_name='book_detail',  ##反向解析
        #     lookup_field='author_id',  ##这里是取这个id值,当你循环到那个外键的那个id值的值的时候,作为参数传进去
        #     lookup_url_kwarg='pk'  ##把还是那个面的id作为参数传进去,就是在url路由里面的有名分组
        # )
        author=serializers.HyperlinkedIdentityField(
            view_name="book_detail",
            lookup_field="author_id",
            lookup_url_kwarg="pk"
    )
#整个流程的基础是基于apiview执行的
from  rest_framework  import  mixins
from   rest_framework  import generics
class  book(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):#首先从前面开始执行,到后面是进行调用这前面的方法
    ####之前的list的方法会找到下面的get_queryset,但里面是没有的,具会去子类里面去找,最终会找到GenericAPIView里面的get_queryset的方法,self.query=get_queryset,最终就是自己定义的下面的query方法
    queryset = Book.objects.all()
    serializer_class=BookModelSerizter
    ##拿到这个自定的序列化的类的对象
    def get(self, request, *args, **kwargs):###得到所有的数据,调用下面的方法
        return self.list(request, *args, **kwargs)
    def  post(self, request, *args, **kwargs):##创建数据,调用下面的方法create
        return self.create(request, *args, **kwargs)
class  bookdetail(mixins.RetrieveModelMixin,mixins.DestroyModelMixin,mixins.UpdateModelMixin,generics.GenericAPIView):
##注明一下,这个第一个是得到数据,第二个是删除单条数据,第三个是修改数据,最后执行这个GenericAPIView,里面进行了得到这个queryset,modelobj对象的处理,在这里最终执行的操作
    queryset = Book.objects.all()
    serializer_class = BookModelSerizter
##调用父类的序列化的方法,serializer_class 在GenericAPIView类下面有做处理
    def get(self,request,*args,**kwargs):
        #得到数据单条数据
        return  self.retrieve(request,*args,**kwargs)##执行下面的函数部分,调用这个函数
    def   delete(self,request,*args,**kwargs):
        #删除数据单条数据
        return  self.destroy(request,*args,**kwargs)#调用DestroyModelMixin类下面的destory方法
    def  put(self,request,*args,**kwargs):
        #修改数据,update的操作(修改单条数据)
        return  self.retrieve(request,*args,**kwargs)