• ModelViewSet supplementary


    Marking extra actions for routing

    https://www.django-rest-framework.org/api-guide/viewsets/#marking-extra-actions-for-routing

    ModelViewSet集成了 CRUD 所有功能, 如果使用此模型, 则后台数据处理逻辑被定死,

    如果有新的定制逻辑, 则通过扩展方法来实现。

    from django.contrib.auth.models import User
    from rest_framework import status, viewsets
    from rest_framework.decorators import action
    from rest_framework.response import Response
    from myapp.serializers import UserSerializer, PasswordSerializer
    
    class UserViewSet(viewsets.ModelViewSet):
        """
        A viewset that provides the standard actions
        """
        queryset = User.objects.all()
        serializer_class = UserSerializer
    
        @action(detail=True, methods=['post'])
        def set_password(self, request, pk=None):
            user = self.get_object()
            serializer = PasswordSerializer(data=request.data)
            if serializer.is_valid():
                user.set_password(serializer.validated_data['password'])
                user.save()
                return Response({'status': 'password set'})
            else:
                return Response(serializer.errors,
                                status=status.HTTP_400_BAD_REQUEST)
    
        @action(detail=False)
        def recent_users(self, request):
            recent_users = User.objects.all().order_by('-last_login')
    
            page = self.paginate_queryset(recent_users)
            if page is not None:
                serializer = self.get_serializer(page, many=True)
                return self.get_paginated_response(serializer.data)
    
            serializer = self.get_serializer(recent_users, many=True)
            return Response(serializer.data)

    例子

    https://github.com/fanqingsong/draw_guess/blob/master/backend/chat/views.py

    class CommentViewSet(viewsets.ModelViewSet):
        """
        """
        queryset = Comments.objects.all()
        serializer_class = CommentsSerializer
    
        @action(methods=['get'], detail=False)
        def query(self, request):
            # print("-------------------")
            # print(request.query_params)
    
            drawing = request.query_params["drawing"]
            # print("=====")
            # print(drawing)
    
            querydata = Comments.objects.filter(drawing=drawing).order_by('id')
    
            serializer = CommentsSerializer(querydata, many=True)
    
            return Response(serializer.data)

    django model query

    https://docs.djangoproject.com/en/3.2/topics/db/queries/#retrieving-specific-objects-with-filters

    >>> Entry.objects.filter(
    ...     headline__startswith='What'
    ... ).exclude(
    ...     pub_date__gte=datetime.date.today()
    ... ).filter(
    ...     pub_date__gte=datetime.date(2005, 1, 30)
    ... )

    select_related and serializer

    https://stackoverflow.com/questions/50996306/show-and-serialize-the-results-of-select-related-model-method

    PostSerializer():
        user = UserSerializer()
        class Meta:
            model = Post
            fields = ('name', 'user')
    出处:http://www.cnblogs.com/lightsong/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    Google笔试题
    OpenStack Ceilometer简介
    OpenStack Object Storage(Swift)架构、原理及特性
    【大话存储2读书笔记】磁盘IO的重要概念
    递归,汉诺塔游戏
    函数定义与使用
    字符串操作
    for循环:用turtle画一颗五角星
    列表、元组、字典、集合的定义、操作与综合练习
    npm 相关
  • 原文地址:https://www.cnblogs.com/lightsong/p/15550181.html
Copyright © 2020-2023  润新知