GenericAPIView

继承自APIVIew,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。 



from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from .models import Classes
from .serializers import Classesserializers


class GetView(GenericAPIView):
    # 指定查询集
    queryset=Classes.objects.all()
    # 指定序列化器
    serializer_class=Classesserializers

    def get(self, request):
        #  data = Classes.objects.all()
        #  serial = Classesserializers(data, many=True)
        list = self.get_queryset()
        ser = self.get_serializer(list, many=True)
        return Response(ser.data)

    # 添加和修改是反序列化,需要进行验证
    # 序列化过程:将获取到的数据对象转化为json返回前端,获取后端数据库中的数据-->json返回前端
    # 反序列化:将前端的数据转化为数据对象,接收前端->验证数据->保存或更新新的数据对象

    def post(self, request):
        #   data = Classes.objects.all()
        data = request.data
        # print(data)
        ser = Classesserializers(data=data)
        ser.is_valid()  # 验证
        if (ser.errors):
            return Response({'error': ser.errors},status=400)
        # 保存,信息正确保存到后端数据库
        ser.save()
        return Response(ser.data)


class ClassItemView(GenericAPIView):
    # 指定查询集
    queryset=Classes.objects.all()
    # 指定序列化器
    serializer_class=Classesserializers
    def put(self, request, pk):
        data = request.data
        try:
            cls = self.get_object()
            # cls=Classes.objects.get(id=id)
        except:
            return Response({'error': '该班级不存在'})
        ser = self.get_serializer(cls, data, partial=True)
        ser.is_valid()
        if (ser.errors):
            return Response({'error': ser.errors})
        ser.save()
        return Response(ser.data)

    def get(self, request, pk):
        try:
            cls = self.get_object()
            # cls=Classes.objects.get(id=id)
        except:
            return Response({'error': '该班级不存在'})
        ser = self.get_serializer(cls)
        return Response(ser.data)

    def delete(self, request, pk):
        self.get_object().delete()
        # Classes.objects.get(id=id).delete()
        return Response({})

支持定义的属性:

  • 列表视图与详情视图通用:
    • queryset 列表视图的查询集
    • serializer_class 视图使用的序列化器
  • 列表视图使用:
    • pagination_class 分页控制类
    • filter_backends 过滤控制后端
  • 详情页视图使用:
    • lookup_field 查询单一数据库对象时使用的条件字段,默认为'pk'
    • lookup_url_kwarg 查询单一数据时URL中的参数关键字名称,默认与look_field相同

提供的方法: 

  •         get_queryset(self):返回视图使用的查询集,是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写
  • def get_queryset(self):
        user = self.request.user
        return user.accounts.all()
  •         get_serializer_class(self):返回序列化器类,默认返回serializer_class,可以重写def get_serializer_class(self): if self.request.user.is_staff: return FullAccountSerializer return BasicAccountSerializer
  • def get_serializer_class(self):
        if self.request.user.is_staff:
            return FullAccountSerializer
        return BasicAccountSerializer
  •         get_serializer(self, args, *kwargs):
  •                 返回序列化器对象,被其他视图或扩展类使用,如果我们在视图中想要获取序列化器对象,可以直接调用此方法。
  •                 注意,在提供序列化器对象的时候,REST framework会向对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。
  •         get_object(self) 返回详情视图所需的模型类数据对象,默认使用lookup_field参数来过滤queryset。 在试图中可以调用该方法获取详情信息的模型类对象。
  •         若详情访问的模型类对象不存在,会返回404。
  •         该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。
# url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view()),
class BookDetailView(GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值