对GenericAPIview即其方法的一些理解

如果要用这个模型类,你要知道一个概念。
查询结果集是会被缓存的,相当于,当我们执行模型类.objects.all()后,数据会放到缓存中。
当我们的类视图继承了GenericAPIview,必须在定义的方法前,指定查询结果集和所要使用的序列化器。

from book_drf.serializer import BookSerializer
from rest_framework.response import Response
from books import models
# Create your views here.

from rest_framework.generics import GenericAPIView


class BooksView(GenericAPIView):
    # 指定查询结果集
    # 这时候数据已经查找过了,接下来我们的操作只是在查询结果集里面找到合适的数据而已
    queryset = models.BookInfo.objects.all()
    # 指定所要使用的序列化器
    serializer_class = BookSerializer

    def get(self, request):
        print(request.quary_params)
        # books = models.BookInfo.objects.all()
        # 得到查询结果集
        books = self.get_queryset()
        # 使用序列化器
        # ser = BookSerializer(instance=books, many=True)
        ser = self.serializer_class(instance=books, many=True)
        return Response(ser.data)

    def post(self, request):
        data = request.data

        ser = self.serializer_class(data=data)
        ser.is_valid(raise_exception=True)  # 完成验证,ser.errors就有数据了,哪个错哪个字典里面都有,空就代表传的正确

        ser.save()

        return Response(ser.data)
class BookView(GenericAPIView):
    
    # 指定查询结果集
    # 这时候数据已经查找过了,接下来我们的操作只是在查询结果集里面找到合适的数据而已
    queryset = models.BookInfo.objects.all()
    # 指定所要使用的序列化器
    serializer_class = BookSerializer

    def get(self, request,pk):

        # get_object()方法根据pk参数查找queryset中的数据对象
        book = self.get_object()


        ser = self.serializer_class(book)


        return Response(ser.data)

当我们指定了查询结果集和用的序列化器后,接下来的一切都是围绕着这两个进行的。
指定了查询结果集,就代表数据已经定了,接下来都是在这个查询结果集里面进行对数据库的增删查改了。
要使用序列化器,直接 self.serializer_class()调用。
要得到查询结果集:self.get_quaryset()
要得到单独的一个对象:self.get_object()
刚开始我不太懂,为什么不传入数据,还能在结果集中找到相应的对象呢,他就好像能自动的把上边参数拿到,然后再在查询结果集中进行匹配一样,这不科学好么,我们都知道,不传入参数,函数根本都不知道你的好么。
我做了实验,第一次,先把pk改成了id,会报错,说没有pk,这代表,self.get_object()中函数中是有一个专门获取pk值的一个东西,这就代表,我们传入的参数名字就必须是pk,不是pk,找不到。
然后我又试了下,传入的值不是id,而是其他的字段,发现无法找到数据,这代表,self.get_object()中只是针对id值的操作,对其他的值是无法作为条件查询的。

总结一下实验结果。
当你调用了self.get_object(),谁调用他,他就会先从那个调用他的函数中获取到名为pk的值,再将名为pk的值作为id条件,在查询结果集中进行匹配,匹配成功,将对象返回出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值