当前位置: 首页 > news >正文

网站建设与网页设计 视频教程东莞网络营销代运营

网站建设与网页设计 视频教程,东莞网络营销代运营,制作俄语网站,云南网站制作怎么计费1. GenericAPIView [通用视图类],概述 继承自 APIView增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常在使用时,可搭配一个或者多个Mixin扩展类源码 当我们查看 GenericAPIView 的源码时&#xff0c…

1. GenericAPIView [通用视图类],概述

  • 继承自 APIView
  • 增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。
  • 通常在使用时,可搭配一个或者多个Mixin扩展类
  • 源码
    当我们查看 GenericAPIView 的源码时,发现,他也是继承了views.APIView
class GenericAPIView(views.APIView):"""Base class for all other generic views."""# You'll need to either set these attributes,# or override `get_queryset()`/`get_serializer_class()`.# If you are overriding a view method, it is important that you call# `get_queryset()` instead of accessing the `queryset` property directly,# as `queryset` will get evaluated only once, and those results are cached# for all subsequent requests.queryset = Noneserializer_class = None# If you want to use object lookups other than pk, set 'lookup_field'.# For more complex lookup requirements override `get_object()`.lookup_field = 'pk'lookup_url_kwarg = None# The filter backend classes to use for queryset filteringfilter_backends = api_settings.DEFAULT_FILTER_BACKENDS# The style to use for queryset pagination.pagination_class = api_settings.DEFAULT_PAGINATION_CLASSdef get_queryset(self):"""Get the list of items for this view.This must be an iterable, and may be a queryset.Defaults to using `self.queryset`.This method should always be used rather than accessing `self.queryset`directly, as `self.queryset` gets evaluated only once, and those resultsare cached for all subsequent requests.You may want to override this if you need to provide differentquerysets depending on the incoming request.(Eg. return a list of items that is specific to the user)"""assert self.queryset is not None, ("'%s' should either include a `queryset` attribute, ""or override the `get_queryset()` method."% self.__class__.__name__)queryset = self.querysetif isinstance(queryset, QuerySet):# Ensure queryset is re-evaluated on each request.queryset = queryset.all()return querysetdef get_object(self):"""Returns the object the view is displaying.You may want to override this if you need to provide non-standardqueryset lookups.  Eg if objects are referenced using multiplekeyword arguments in the url conf."""queryset = self.filter_queryset(self.get_queryset())# Perform the lookup filtering.lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_fieldassert lookup_url_kwarg in self.kwargs, ('Expected view %s to be called with a URL keyword argument ''named "%s". Fix your URL conf, or set the `.lookup_field` ''attribute on the view correctly.' %(self.__class__.__name__, lookup_url_kwarg))filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}obj = get_object_or_404(queryset, **filter_kwargs)# May raise a permission deniedself.check_object_permissions(self.request, obj)return objdef get_serializer(self, *args, **kwargs):"""Return the serializer instance that should be used for validating anddeserializing input, and for serializing output."""serializer_class = self.get_serializer_class()kwargs.setdefault('context', self.get_serializer_context())return serializer_class(*args, **kwargs)def get_serializer_class(self):"""Return the class to use for the serializer.Defaults to using `self.serializer_class`.You may want to override this if you need to provide differentserializations depending on the incoming request.(Eg. admins get full serialization, others get basic serialization)"""assert self.serializer_class is not None, ("'%s' should either include a `serializer_class` attribute, ""or override the `get_serializer_class()` method."% self.__class__.__name__)return self.serializer_classdef get_serializer_context(self):"""Extra context provided to the serializer class."""return {'request': self.request,'format': self.format_kwarg,'view': self}def filter_queryset(self, queryset):"""Given a queryset, filter it with whichever filter backend is in use.You are unlikely to want to override this method, although you may needto call it either from a list view, or from a custom `get_object`method if you want to apply the configured filtering backend to thedefault queryset."""for backend in list(self.filter_backends):queryset = backend().filter_queryset(self.request, queryset, self)return queryset@propertydef paginator(self):"""The paginator instance associated with the view, or `None`."""if not hasattr(self, '_paginator'):if self.pagination_class is None:self._paginator = Noneelse:self._paginator = self.pagination_class()return self._paginatordef paginate_queryset(self, queryset):"""Return a single page of results, or `None` if pagination is disabled."""if self.paginator is None:return Nonereturn self.paginator.paginate_queryset(queryset, self.request, view=self)def get_paginated_response(self, data):"""Return a paginated style `Response` object for the given output data."""assert self.paginator is not Nonereturn self.paginator.get_paginated_response(data)

2.get_serializer_class(self)

  • 当出现一个视图类中调用多个序列化器时,那么可以通过条件判断在 get_serializer_class 方法中通过返回不同的序列化
  • 类名就可以让视图方法执行不同的序列化器对象了
  • 函数返回序列化器类,默认返回 serializer_class ,可以重写
def get_serializer_class(self):"""Return the class to use for the serializer.Defaults to using `self.serializer_class`.You may want to override this if you need to provide differentserializations depending on the incoming request.(Eg. admins get full serialization, others get basic serialization)"""assert self.serializer_class is not None, ("'%s' should either include a `serializer_class` attribute, ""or override the `get_serializer_class()` method."% self.__class__.__name__)return self.serializer_class

3.get_serializer_class(self)

  • 函数返回序列化器队对象
  • 主要用来提供给Mixin扩展类使用,如果我们在视图中,想要获取序列化器对象,也可以直接调用此方法
  • 注意,该方法在提供序列化器对象的时候,会向序列化器对象的context属性补充三个数据:request、
    format、view、这三个数据对象可以定义序列化器时使用
    • request 当前视图的请求对象
    • view 当前请求的类视图对象
    • format 当前请求期望返回的数据格式
def get_serializer(self, *args, **kwargs):"""Return the serializer instance that should be used for validating anddeserializing input, and for serializing output."""serializer_class = self.get_serializer_class()kwargs.setdefault('context', self.get_serializer_context())return serializer_class(*args, **kwargs)

4.get_queryset(self)

  • 返回视图使用的查询集
  • 主要用来提供Mixin扩展类使用,是列表视图与详情视图获取数据的基础
  • 默认返回queryset属性,可以重写
def get_queryset(self):"""Get the list of items for this view.This must be an iterable, and may be a queryset.Defaults to using `self.queryset`.This method should always be used rather than accessing `self.queryset`directly, as `self.queryset` gets evaluated only once, and those resultsare cached for all subsequent requests.You may want to override this if you need to provide differentquerysets depending on the incoming request.(Eg. return a list of items that is specific to the user)"""assert self.queryset is not None, ("'%s' should either include a `queryset` attribute, ""or override the `get_queryset()` method."% self.__class__.__name__)queryset = self.querysetif isinstance(queryset, QuerySet):# Ensure queryset is re-evaluated on each request.queryset = queryset.all()return queryset

5.def get_object(self):

  • 返回详情视图所需要的模型类的数据对象
  • 主要用来提供给Mixin扩展类使用
  • 在视图中可以调用该方法获取详情信息的模型对象
  • 若详情访问的模型类对象不存在,会返回404
  • 该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问
def get_object(self):"""Returns the object the view is displaying.You may want to override this if you need to provide non-standardqueryset lookups.  Eg if objects are referenced using multiplekeyword arguments in the url conf."""queryset = self.filter_queryset(self.get_queryset())# Perform the lookup filtering.lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_fieldassert lookup_url_kwarg in self.kwargs, ('Expected view %s to be called with a URL keyword argument ''named "%s". Fix your URL conf, or set the `.lookup_field` ''attribute on the view correctly.' %(self.__class__.__name__, lookup_url_kwarg))filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}obj = get_object_or_404(queryset, **filter_kwargs)# May raise a permission deniedself.check_object_permissions(self.request, obj)return obj

5. 使用实例

  • view.py
from rest_framework.generics import GenericAPIViewclass BookSerializers(serializers.ModelSerializer):class Meta:model = Bookfields = "__all__"class BookView(GenericAPIView):# queryset 这个变量名称不能变queryset = Book.objects.all()# # serializer_class 这个变量名称不能变serializer_class = BookSerializers# 查所有def get(self, request):# get_queryset() 就是取 queryset 这个变量的值,即 Book.objects.all(),取出所有的数据# book_list = self.get_queryset()# 构建序列化器对象# serializer = self.get_serializer_class()(instance=self.get_queryset(), many=True)serializer = self.get_serializer(instance=self.get_queryset(), many=True)return Response(serializer.data)# 增加一个def post(self, request):# 获取参数data = request.data#  构建序列化器对象serializer = self.get_serializer(data=data)# 校验数据# 校验原理:# 1.所有符合的数据都放在,serializer.validated_data# 2.不符合数据的都放在,serializer.errorsif serializer.is_valid():  # 返回一个布尔值,所有字段都符合才返回True,反之,返回False# 数据校验通过,存入数据库中# new_book = Book.objects.create(**serializer.validated_data)serializer.save()return Response(serializer.data)else:# 数据校验失败return Response(serializer.errors)class BookDetailsView(GenericAPIView):# queryset 这个变量名称不能变queryset = Book.objects.all()# # serializer_class 这个变量名称不能变serializer_class = BookSerializers# 查一个def get(self, request, pk):serializer = self.get_serializer(instance=self.get_object(), many=False)return Response(serializer.data)# 修改一个def put(self, request, pk):book = request.data# 构建序列化器对象serializer = self.get_serializer(instance=self.get_object(), data=book)if serializer.is_valid():serializer.save()return Response(serializer.data)else:return Response(serializer.errors)# 删除一个def delete(self, request, pk):self.get_object().delete()return Response()
  • urls.py
from django.contrib import admin
from django.urls import path, re_path
from sers import viewsurlpatterns = [path('admin/', admin.site.urls),path('sers/book/', views.BookView.as_view()),# 注意: 这块是固定的pkre_path(r'sers/book/(?P<pk>\d+)', views.BookDetailsView.as_view()),
]
http://www.hengruixuexiao.com/news/9839.html

相关文章:

  • 做网站好还是网页好seo优化推广软件
  • 在哪里可以学做饰品网站肇庆seo按天计费
  • 顺德做营销网站公司拉新平台哪个好佣金高
  • 网站导航设计佛山疫情最新情况
  • sucuri wordpress首页优化排名
  • 海口小微企业网站建设成都搜狗seo
  • 酒店如何做网站电子商务推广
  • 门户网站制作模板广州网络推广策划公司
  • 成都网站制作公司dedecms网站优化就是搜索引擎优化
  • 新疆建设网站统计报直报平台研究生培训机构排名
  • 做阿里巴巴网站店铺装修费用磁力王
  • 付费的网站是指google搜索优化方法
  • 服饰类网站开发项目搭建网站需要哪些步骤
  • 广东省建设工程安全协会网站seo快速排名工具
  • wordpress hasnavmenuseo定义
  • 唐山建设局网站做互联网推广的公司
  • 泊头哪有哪家做网站做的号网络推广公司收费标准
  • 公司网站建设的费用如何入账省好多会员app
  • 深圳营销型网站制作公司进一步优化落实
  • 网站关键词排名忽然网络营销的主要传播渠道
  • 放网站的图片做多大分辨率百度在西安有分公司吗
  • 汕头站扩建seo公司资源
  • 长基建站郑州竞价托管
  • BVDO 网站开发流程综合查询
  • 学做网站推广要多久时间百度高级检索入口
  • 懒人之家网站模板软件外包公司排名
  • 做网站好还是阿里巴巴排行榜123网
  • 如何修改网站后台时间app运营方案
  • 网页游戏吧深圳专业seo外包
  • 新网页游戏网游免费网站seo优化