如果要用这个模型类,你要知道一个概念。
查询结果集是会被缓存的,相当于,当我们执行模型类.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条件,在查询结果集中进行匹配,匹配成功,将对象返回出来。