django类视图as_view()方法解析总结

本文探讨了Django REST framework中URL控制的概念,详细解析了as_view()方法如何使URL根据请求方式调用对应的视图函数,以及自定义路由的实现方式。通过具体的代码示例,展示了BookView和BookDetailView类视图的GET、POST、PUT和DELETE请求处理。

rest-framework之url控制
as_view():
闭包的作用及其优缺点:

一 、自定义路由(原始方式)

具体请参考上述链接1

  • url中使用了as_view()方法后,返回的闭包会根据请求的方式到对应的视图函数中找以请求方式命名的函数进行执行。
  • 而传统的url中不使用as_view()方法,则直接执行对应视图函数,和请求方法没有关系。
from django.conf.urls import url
from app01 import views
urlpatterns = [
    url(r'^books/$', views.BookView.as_view()),
    url(r'^books/(?P<pk>\d+)$', views.BookDetailView.as_view()),
]
class BookView(APIView):
 
    def get(self, request):
        book_list = models.Book.objects.all()
        bs = BookSerializers(book_list, many=True)
        return Response(bs.data)
 
    def post(self, request):
        # 添加一条数据
        print(request.data)
 
        bs=BookSerializers(data=request.data)
        if bs.is_valid():
            bs.save()  # 生成记录
            return Response(bs.data)
        else:
 
            return Response(bs.errors)
 
class BookDetailView(APIView):
    def get(self,request,pk):
        book_obj=models.Book.objects.filter(pk=pk).first()
        bs=BookSerializers(book_obj,many=False)
        return Response(bs.data)
    def put(self,request,pk):
        book_obj = models.Book.objects.filter(pk=pk).first()
 
        bs=BookSerializers(data=request.data,instance=book_obj)
        if bs.is_valid():
            bs.save() # update
            return Response(bs.data)
        else:
            return Response(bs.errors)
    def delete(self,request,pk):
        models.Book.objects.filter(pk=pk).delete()
 
        return Response("")
<think> 我们被要求总结Django路由、模型、视图的常用方法实例。 根据提供的引用,我们可以提取以下信息: 路由(Routing): - 引用[1]:使用视图类(类视图)配置路由,通过`as_view()`方法类视图转换为视图函数。 - 引用[2]:使用`include`方法构建层次化的路由系统,每个应用可以有自己的`urls.py`,并配合命名空间管理。 - 引用[4]:使用DRF(Django REST Framework)的`DefaultRouter`来注册视图集(ViewSet),自动生成路由。 - 引用[5]:在模板中使用`{% url %}`标签反向生成URL,支持传递参数。 视图(View): - 引用[1]:使用类视图(AboutView)来处理请求。 - 引用[3]:定义函数视图(shop1),接收一个`request`参数并返回HttpResponse。 - 引用[4]:使用DRF的视图集(BookView),通过视图集可以定义多个动作(如list, create, retrieve, update, destroy)。 模型(Model): - 提供的引用中没有直接关于模型的代码,但根据Django知识,模型通常定义在`models.py`中,使用ORM。 因此,我们需要结合Django基础知识,补充模型部分的常用方法,并对路由和视图进行实例总结。 我们将分为三部分进行总结:路由、模型、视图。 注意:由于引用中没有模型实例,我们将根据常规用法补充模型部分。 下面开始总结: </think> ### Django路由、模型、视图常用方法实例总结 #### 一、路由配置(URL Routing) 1. **基础路由映射** 函数视图路由配置: ```python # urls.py from django.urls import path from . import views urlpatterns = [ path('shop/', views.shop1, name='shop'), # 普通函数视图 ] ``` ```python # views.py from django.http import HttpResponse def shop1(request): return HttpResponse("欢迎访问商店!") # [^3] ``` 2. **类视图路由** 使用`as_view()`方法转换类视图: ```python # urls.py from .views import AboutView urlpatterns = [ re_path(r'^about/$', AboutView.as_view(), name='about'), # [^1] ] ``` 3. **路由分发(include)** 模块化路由配置: ```python # 主urls.py from django.urls import include, path urlpatterns = [ path('api/', include('app.urls', namespace='api')), # [^2] ] # app/urls.py from django.urls import path from . import views urlpatterns = [path('books/', views.BookList.as_view())] ``` 4. **DRF视图集路由** 自动生成RESTful路由: ```python from rest_framework.routers import DefaultRouter from .views import BookView router = DefaultRouter() router.register(r"book", BookView) # 自动生成CRUD路由 [^4] urlpatterns += router.urls ``` --- #### 二、模型操作(Models) ```python # models.py from django.db import models class Book(models.Model): title = models.CharField(max_length=200) pub_date = models.DateField() # 1. 自定义方法 def is_recent(self): return self.pub_date.year >= 2020 # 2. 元数据配置 class Meta: ordering = ['-pub_date'] indexes = [models.Index(fields=['title'])] ``` **常用操作实例:** ```python # 创建对象 Book.objects.create(title="Django指南", pub_date="2023-01-15") # 查询集过滤 recent_books = Book.objects.filter(pub_date__year__gte=2020) # 聚合计算 from django.db.models import Count Book.objects.values('pub_date__year').annotate(total=Count('id')) # 关联查询(外键示例) class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): author = models.ForeignKey(Author, on_delete=models.CASCADE) # 反向查询 author = Author.objects.get(name="张三") author.book_set.all() # 获取该作者所有书籍 ``` --- #### 三、视图处理(Views) 1. **函数视图** ```python from django.shortcuts import render def book_detail(request, book_id): book = Book.objects.get(id=book_id) return render(request, 'detail.html', {'book': book}) ``` 2. **类视图(CBV)** ```python from django.views.generic import ListView class BookListView(ListView): model = Book template_name = 'book_list.html' context_object_name = 'books' # 重写get_queryset方法 def get_queryset(self): return Book.objects.filter(is_published=True) ``` 3. **DRF视图集** ```python from rest_framework import viewsets class BookViewSet(viewsets.ModelViewSet): queryset = Book.objects.all() serializer_class = BookSerializer # 自定义动作 @action(detail=True, methods=['post']) def publish(self, request, pk=None): book = self.get_object() book.publish() return Response({'status': 'published'}) # [^4] ``` --- #### 四、实用技巧 1. **URL反向解析** 模板中使用: ```html <a href="{% url 'about' %}">关于我们</a> <a href="{% url 'api:books' grade_id=3 %}">分类书籍</a> <!-- 带参数 [^5] --> ``` 代码中使用: ```python from django.urls import reverse url = reverse('book-detail', args=[10]) # /books/10/ ``` 2. **路由调试** 使用`django-extensions`检查路由: ```bash python manage.py show_urls # 显示所有路由配置 [^2] ``` 3. **视图参数传递** 捕获URL参数: ```python # urls.py path('books/<int:pk>/', views.book_detail) # views.py def book_detail(request, pk): # 自动获取pk参数 ... ``` --- **相关实践建议:** - 路由层:使用`include`实现应用解耦,严格使用命名空间[^2] - 模型层:为高频查询字段添加数据库索引[^1] - 视图层:RESTful API优先使用视图集(ViewSet) - 定期运行`python manage.py check`验证配置[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值