Django rest framework使用ModelViewSet视图集

参考:https://www.cnblogs.com/zgboy/p/15097848.html

ModelViewSet

ModelViewSet是封装度最高的DRF的视图类。包含了增删改查中的所有接口操作。

它继承自GenericViewSet、ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

使用视图集,可以将一系列逻辑相关的动作放到一个类中:
list() 提供一组数据
retrieve() 提供单个数据(详情)
create() 创建数据
update() 更新数据
destory() 删除数据

小试牛刀

mysite/urls.py

from rest_framework import routers
from rbac.views import user, menu

router = routers.SimpleRouter()
router.register(r'menu', menu.MenuViewSet, basename='menu')
router.register(r'user', user.UserViewSet, basename='user')

urlpatterns = [
    path(r'api/v1/auth/manage/', include(router.urls)),
    path(r'docs/', include_docs_urls(title='星辰', authentication_classes=[],permission_classes=[])),

]
rbac/views/menu.py

class MenuViewSet(ModelViewSet):
    """
    菜单管理:增删改查
    list: 查询
    create: 新增
    """
    queryset = Menu.objects.all()
    serializer_class = MenuSerializer
    pagination_class = MyPagination
    filter_backends = (SearchFilter, OrderingFilter)
    search_fields = ('name',)
    ordering_fields = ('id',)
    authentication_classes = []
    permission_classes = []

    def get_serializer_class(self):
        # if self.action == 'list':
        return MenuSerializer

访问api docs看下效果
在这里插入图片描述

ReadOnlyModelViewSet

ReadOnlyModelViewSet继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin

from rest_framework import viewsets

# 封装请求
class MyResponse(Response):
    @staticmethod
    def success(data, count=0):
        return Response({'data': data, 'meta': {'msg': 'OK', 'status': 200}, 'count': count})

    @staticmethod
    def failed(msg):
        return Response({'data': {}, 'meta': {'msg': msg, 'status': 500}})


class PromViewSet(viewsets.ReadOnlyModelViewSet):
    """
    此视图自动提供`list`和`detail`操作。
    """
    authentication_classes = []
    permission_classes = []

    queryset = PrometheusTemplate.objects.all()
    serializer_class = PrometheusTemplateSerializer

    def list(self, request, *args, **kwargs):
        # permission_classes()
        # authentication_classes()
        # 获取实例
        print(request.query_params)
        if request.query_params.get('query'):
            search_words = request.query_params.get('query').strip()
        else:
            search_words = None
        if search_words is not None:
            # 使用Q对象进行关键字条件查询
            condition = Q(name__icontains=search_words)
            queryset = self.filter_queryset(self.get_queryset().filter(condition).order_by('id'))
        else:
            queryset = self.filter_queryset(self.get_queryset())

        # # 创建对象
        # pg = MyPagination()
        # # 获取分页数据
        # page_query = pg.paginate_queryset(queryset=queryset, request=request, view=self)
        # 序列化数据
        serializer = self.get_serializer(queryset, many=True)

        # page = self.paginate_queryset(queryset)
        # if page is not None:
        #     serializer = self.get_serializer(page, many=True)
        #     return self.get_paginated_response(serializer, many=True)
        # serializer = self.get_serializer(queryset, many=True)
        count = queryset.count()
        return MyResponse.success(serializer.data, count)

    def retrieve(self, request, *args, **kwargs):
        # permission_classes()
        # authentication_classes()
        # 获取实例
        instance = self.get_object()
        # 序列化
        serializer = self.get_serializer(instance)
        return MyResponse.success(serializer.data)

后话:
如果有比较复杂的定制化需求,建议还是直接使用APIView

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的使用Django Rest Framework ModelViewSet实现增删改查的小案例。 首先,我们需要创建一个Django项目并安装Django Rest Framework。在这个例子中,我们将创建一个简单的博客应用程序,包含两个模型:文章和评论。每篇文章可以有多个评论。 1. 创建Django项目和应用程序 ``` $ django-admin startproject blog_project $ cd blog_project $ python manage.py startapp blog ``` 2. 在blog应用程序中创建模型 我们将创建两个模型:文章和评论。 在blog/models.py中添加以下代码: ``` from django.db import models class Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() class Comment(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments') content = models.TextField() ``` 3. 创建序列化器 在blog/serializers.py中添加以下代码: ``` from rest_framework import serializers from .models import Post, Comment class CommentSerializer(serializers.ModelSerializer): class Meta: model = Comment fields = ('id', 'content') class PostSerializer(serializers.ModelSerializer): comments = CommentSerializer(many=True, read_only=True) class Meta: model = Post fields = ('id', 'title', 'content', 'comments') ``` 4. 创建视图 在blog/views.py中添加以下代码: ``` from rest_framework import viewsets from .models import Post, Comment from .serializers import PostSerializer, CommentSerializer class PostViewSet(viewsets.ModelViewSet): queryset = Post.objects.all() serializer_class = PostSerializer class CommentViewSet(viewsets.ModelViewSet): queryset = Comment.objects.all() serializer_class = CommentSerializer ``` 5. 配置URL路由 在blog_project/urls.py中添加以下代码: ``` from django.urls import include, path from rest_framework import routers from blog.views import PostViewSet, CommentViewSet router = routers.DefaultRouter() router.register(r'posts', PostViewSet) router.register(r'comments', CommentViewSet) urlpatterns = [ path('', include(router.urls)), ] ``` 6. 运行服务器并测试API ``` $ python manage.py runserver ``` 现在我们可以使用浏览器或curl访问API。例如,要获取所有文章,可以使用以下URL: ``` http://localhost:8000/posts/ ``` 要创建一篇新文章,可以使用以下curl命令: ``` $ curl -X POST -d '{"title": "My First Post", "content": "Hello World"}' -H 'Content-Type: application/json' http://localhost:8000/posts/ ``` 要更新一篇文章,可以使用以下curl命令: ``` $ curl -X PUT -d '{"title": "My Updated Post", "content": "Hello World Again"}' -H 'Content-Type: application/json' http://localhost:8000/posts/1/ ``` 要删除一篇文章,可以使用以下curl命令: ``` $ curl -X DELETE http://localhost:8000/posts/1/ ``` 以上是使用Django Rest Framework ModelViewSet实现增删改查的简单案例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值