ModelViewSet 是 Django REST framework 提供的一个视图集类,它封装了常见的模型操作方法。
模型类提供了默认的增删改查功能。
它继承自 GenericViewSet
、ListModelMixin
、RetrieveModelMixin
、CreateModelMixin
、UpdateModelMixin
、DestoryModelMixin
。
知识点 | 请求 | url | 特点 |
---|---|---|---|
GenericViewSet | 提供一组通用的视图方法,方便实现特定功能 | ||
ListModelMixin | get | 127.0.0.1:8000/book/ | 提供 list 方法,用于获取资源列表 |
RetrieveModelMixin | get | 127.0.0.1:8000/book/{1}/ | 提供 retrieve 方法,用于获取单个资源的详细信息 |
CreateModelMixin | post | 127.0.0.1:8000/book/ | 提供 create 方法,用于创建资源 |
UpdateModelMixin | put | 127.0.0.1:8000/book/{1}/ | 提供 update 方法,用于更新资源 |
DestroyModelMixin | detete | 127.0.0.1:8000/book/{1}/ | 提供 destroy 方法,用于删除资源 |
自定义 | get/post | 127.0.0.1:8000/book/自定义 | 用户自定义方法/函数 |
这些技术知识点可以配合使用,帮助我们快速构建出具有 CRUD 功能的 Web 应用,并且遵循了 Django 框架的惯例和最佳实践。它们的应用场景包括博客系统、电商平台、社交网络等各种类型的 Web 应用。通过使用这些技术知识点,我们能够提高开发效率,减少重复的代码编写工作,并且保证代码的一致性和可维护性。
设置 queryset
属性为要查询的对象集合,并设置 serializer_class
属性为对应的序列化器类。
view.py
from rest_framework.viewsets import ModelViewSet
class YourModelViewSet(ModelViewSet):
queryset = YourModel.objects.all()
serializer_class = YourModelSerializer
使用 ModelViewSet 后,你将自动获得默认的 CRUD 方法。
from rest_framework.decorators import action
#### modelviewset
class GoodsCategoryViewSet(ModelViewSet):
# 指定查询集(用到的数据)
queryset = GoodsCategory.objects.all()
# 指定查询集用到的序列化容器
serializer_class = GoodsCategorySerializer
@action(detail=False, methods=['get'])
def latest(self, request):
latest_obj = GoodsCategory.objects.latest('id')
print(latest_obj)
return Response("helllo 你调用了自定义的函数")
serializer.py
class GoodsSerializer(ModelSerializer):
# 外键字段相关的数据 需要单独写
category = GoodsCategorySerializer()
class Meta:
# 指定需要序列化的表
model = Goods
# 指定我们需要序列化的字段
fields = '__all__'
DefaultRouter
是Django REST framework中提供的一个路由器类,用于自动生成URL路由。
路由器是将URL与视图函数或视图集关联起来的一种机制。Django REST framework的路由器通过简单的配置可以自动生成标准的URL路由,从而减少了手动编写URL路由的工作量。
urls.py
from django.contrib import admin
from django.urls import path
from apps.erp_test.views import *
from rest_framework import routers
router = routers.DefaultRouter()
router.register('GoodsCategory', GoodsCategoryViewSet)
urlpatterns = [
path('admin/', admin.site.urls),
path('filtergoodscategory/', FilterGoodsCategory),
path('insertgoodscategory/', InsertGoodsCategory),
path('filtergoodscategoryapi/', FilterGoodsCategoryAPI.as_view()),
path('getgoods/', GetGoods.as_view()),
]
urlpatterns += router.urls
主要是将一个类里面的所有方法都加入到路由里面来。
使用routers.DefaultRouter()
创建了一个默认的路由器对象,并使用router.register()
方法注册了一个视图集,GoodsCategoryViewSet
。这样可以自动为这个视图集生成对应的URL路由,并将其添加到urlpatterns
中。
from rest_framework.decorators import action
@action
是 Django REST framework 中的一个装饰器,用于将自定义函数转换为视图集的一个动作。@action
装饰器提供了一种定义自定义函数的方式,这些函数并不直接对应于标准的 CRUD 操作(Create-Read-Update-Delete),而是实现一些其他的自定义行为或业务逻辑。
“ @action 装饰器”用于在 ViewSet 中创建自定义动作(custom action),为 ViewSet 提供了更灵活应用且 @action 只在ViewSet视图集中生效。视图集中附加action装饰器可接收两个参数:
(1)methods: 声明该action对应的请求方式.
(2)detail: True/False声明该action的路径是否是action对应的请求方式。
views.py
class GoodsCategoryViewSet(ModelViewSet):
# 指定查询集(用到的数据)
queryset = GoodsCategory.objects.all()
# 指定查询集用到的序列化容器
serializer_class = GoodsCategorySerializer
@action(detail=False, methods=['get'])
def latest(self, request):
latest_obj = GoodsCategory.objects.latest('id')
print(latest_obj)
return Response("helllo 你调用了自定义的函数")
@action(detail=False, methods=['get','post'])
def delete_example(self, request):
name = request.data.get('name')
# 删除名称为 'name' 的商品
categories_to_delete = GoodsCategory.objects.filter(name=name)
# 使用delete()方法删除对象
deleted_count= categories_to_delete.delete()
print(f"Deleted {deleted_count} categories.")
@action(detail=False, methods=['get','post'])
def create_example(self, request):
name = request.data.get('name')
# 使用create()方法创建新的商品分类对象
created_category = GoodsCategory.objects.create(name)
print("Created category:", created_category)
其中,detail=False
表示该动作不需要处理单个对象,而是处理整个集合;
被 @action
装饰的函数需要作为方法定义在视图集类中,并且在使用 router.register()
注册视图集时,需要指定 basename
参数,以确保该动作的 URL 能够正确映射到视图集。