关于 DRF ViewSets
REST 框架包含一个用于处理路由的抽象 ViewSets.
当 ViewSet 类被实例化为一组视图时,通常仅在最后一刻将其绑定到一组方法处理程序,通常通过使用一个 Router 类来定义 URL conf 的复杂性
ModelViewSet
类视图集自动提供list
,create
,检索retrieve
,update
和destroy
actions。默认情况下,使用@action 装饰器的自定义操作将响应 GET 请求。methods 如果我们想要一个响应 POST 请求的动作,则可以使用参数。
@action(methods=['post'])
。@action
这个装饰可以用来添加不符合标准的任何自定义端点create
/update
/delete
风格。默认情况下,自定义操作的 URL 取决于方法名称本身。如果要更改 url 的构造方式,则可以将其 url_path 作为装饰关键字参数。
示例
models.py
from django.db import models
class Testmethods(models.Model):
gets = models.CharField(max_length=255)
posts = models.CharField(max_length=255)
deletes = models.CharField(max_length=255)
options = models.CharField(max_length=255)
def __str__(self):
return self.gets
class Meta:
verbose_name = "测试视图集"
verbose_name_plural = verbose_name
serializers.py
from rest_framework import serializers
from .models import Testmethods
class TestSerializer(serializers.ModelSerializer):
class Meta:
model = Testmethods
fields = '__all__'
view.py
from rest_framework.decorators import action
from rest_framework import viewsets
from .models import Testmethods
from .serializers import TestSerializer
class methodsviewset(viewsets.ModelViewSet):
app_model = Testmethods
queryset = Testmethods.objects.all()
serializer_class = TestSerializer
permission_classes = [....]
urls.py
from rest_framework.routers import SimpleRouter
from .views import methodsviewset
from .models import Testmethods
app_name = 'testviewsets'
router = SimpleRouter()
router.register(r'', methodsviewset)
urlpatterns = router.urls
根 urls.py
urlpatterns = [
path('test/',include("testviewsets.urls")),
]
解析
以上代码可产生以下路由,无需显示指定,默认返回的均为 request 的 data 数据。当需要对返回的数据进行操作时,可显示定义该方法,如def list(self,request):
则 list 请求会默认使用这个函数进行处理。
- 当
methods = GET
时
获取list
http://127.0.0.1:8000/test/
获取detail
http://127.0.0.1:8000/test/id/
- 当
methods = POST
时
create
http://127.0.0.1:8000/test/
{json}
- 当
methods = PUT
时
update
http://127.0.0.1:8000/test/id/
{json}
- 当
methods = DELETE
时
delete
http://127.0.0.1:8000/test/id/