建立视图类
在模型和序列器建立完成之后,需要写业务逻辑达到访问网站内容的功能。视图类就是描述访问网站的业务逻辑的类。
在Django REST中,我们可以直接继承通用的视图类,即generics,然后根据需要,继承不同的具体功能类。
常用的继承类如下:
- ListAPIView
- RetrieveAPIView
- DestroyAPIView
- UpdateAPIView
- ListCreateAPIView
- RetrieveUpdateAPIView
- RetrieveDestroyAPIView
- RetrieveUpdateDestroyAPIView
以下是具体的视图函数的运用实例:
from django.shortcuts import render
# Create your views here.
#基于Generic views
from rest_framework import generics
from computerapp.models import Product
from computerapp.serializers import ProductListSerializer, ProductRetrieveSerializer
class ProductListViews(generics.ListAPIView):
"""
产品列表
"""
#获取产品的所有对象
queryset = Product.objects.all()
#指明使用的序列器类
serializer_class = ProductListSerializer
class ProductRetrieveView(generics.RetrieveAPIView):
"""
产品详情
"""
queryset = Product.objects.all()
serializer_class = ProductRetrieveSerializer
class ProductListByCategoryView(generics.ListAPIView):
"""
产品按类别列表
"""
serializer_class = ProductListSerializer
#获取特殊处理后的对象,需要重写get_queryset这个方法
def get_queryset(self):
#从request中获得category参数
category = self.request.query_params.get('category', None)
if category is not None:
queryset = Product.objects.filter(category=category)
else:
queryset = Product.objects.all()
return queryset
class ProductListByCategoryManufacturerView(generics.ListAPIView):
"""
产品按类别,厂商列表
"""
serializer_class = ProductListSerializer
def get_queryset(self):
category = self.request.query_params.get('category',None)
manufacturer = self.request.query_params.get('manufacturer', None)
#如果类别非空,则过滤得到类别和厂商和传入的参数相同的对象
if category is not None:
queryset = Product.objects.filter(category=category, manufacturer=manufacturer)
#否则获得所有的对象
else:
queryset = Product.objects.all()
return queryset
添加url
url是用于直接定位网站资源的路径,通过url直接链接到相应的视图类中,即访问视图类,最终呈现出访问网站的效果。
在Django REST 中url函数的参数功能如下:
- 参数1:传入一个表示url的正则表达式
- 参数2:传入一个链接的视图类
- 参数3: 传入该url的命名空间
以下是具体的url的运用实例:
from django.conf.urls import url
from rest_framework.urlpatterns import format_suffix_patterns
from computerapp import views
urlpatterns = [
#列表页面与详情页面分开做,是为了节省查表所需要的资源,节省成本
url(r'^product_list/$', views.ProductListView.as_view(), name='product_list'),
url(r'^product_retrieve/(?P<pk>[0-9]+)/$', views.ProductRetrieveView.as_view(), name='product_retrieve'),
url(r'^product_list_by_category/$', views.ProductListByCategoryView.as_view(), name='product_list_by_category'),
url(r'^product_list_by_category_manufacturer/$', views.ProductListByCategoryManufacturerView.as_view(), name='product_list_by_category_manufacturer'),
]
#可以在url后面直接加?json或?api获得相应的接口。
urlpatterns = format_suffix_patterns(urlpatterns, allowed=['api', 'json',])
本文介绍了在Django REST框架中如何建立视图类,包括常见的继承自generics的视图,如ListAPIView、RetrieveDestroyAPIView等。同时,文章详细讲解了添加URL的步骤,解释了url函数的参数作用,强调URL是链接视图并呈现网站内容的关键。
640

被折叠的 条评论
为什么被折叠?



