zoukankan      html  css  js  c++  java
  • 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/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    401. Binary Watch
    46. Permutations
    61. Rotate List
    142. Linked List Cycle II
    86. Partition List
    234. Palindrome Linked List
    19. Remove Nth Node From End of List
    141. Linked List Cycle
    524. Longest Word in Dictionary through Deleting
    android ListView详解
  • 原文地址:https://www.cnblogs.com/lightsong/p/15550181.html
Copyright © 2011-2022 走看看