【问题标题】:Creating a new viewset with multiple filters for the viewset get method为 viewset get 方法创建具有多个过滤器的新视图集
【发布时间】:2019-07-03 00:11:41
【问题描述】:

您好,我正在创建一个视图集。我想超越 get 函数并获取所有具有过滤参数的记录,这些参数被传递到 get 视图中。我还希望能够完成其余的 crud 功能 - GET POST PUT DELETE - 并使用通过 url 传递的参数作为 POST 和 UPDATE 的参数。

现在,当我传入参数时,而不是过滤返回的数据,它没有给我任何细节,这不是我想要的。我希望它用作我从数据库返回的所有记录的辅助过滤器。

代码如下:

视图集

class PreferenceUserViewSet(viewsets.ModelViewSet):

    queryset = Preference.objects.all().filter(user_id=1)
    serializer_class = PreferenceSerializer

class PreferenceNamespaceViewSet(viewsets.ModelViewSet):
    queryset = Preference.objects.all().filter(user_id=1)
    serializer_class = PreferenceSerializer

    def get_permissions(self):
        if self.action == 'create' or self.action == 'destroy':
            permission_classes = [IsAuthenticated]
        else: 
            permission_classes = [IsAdminUser]
        return [permission() for permission in permission_classes]

    @permission_classes((IsAuthenticated))
    def list(self, request, namespace=None):
        # switch user_id value with logged in users id
        queryset = Preference.objects.all().filter(user_id=1, namespace=namespace)
        serializer = PreferenceSerializer(queryset, many=True)
        return Response(serializer.data)

网址:

    path('preferences/<str:namespace>/', PreferenceNamespaceViewSet.as_view({
        'get':'list'
    })),
    path('users/<int:pk>/stacks/', person_stack, name='user-stacks'),

我想使用namepsace 作为 GET 中返回的所有数据的辅助过滤器。我还想将它用作创建新首选项时可以输入的数据。

** 我也想用第三个潜在参数做同样的事情...... **

潜在的第三个参数:

urlpatterns = [
    path('preferences/<str:namespace>/<str:path>', PreferencePathViewSet.as_view({
        'get':'list'
    })),
    path('preferences/<str:namespace>/', PreferenceNamespaceViewSet.as_view({
        'get':'list'
    })),
    path('users/<int:pk>/stacks/', person_stack, name='user-stacks'),
]

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    我认为您不应该将命名空间添加为 url 参数,而是可以使用URL querystring 来获取命名空间信息(以及其他参数)。例如:

    # URL
    path('preferences/', PreferencePathViewSet.as_view({
            'get':'list'
        })
    ),
    
    # view
    class PreferenceNamespaceViewSet(viewsets.ModelViewSet):
        queryset = Preference.objects.all().filter(user_id=1)
        serializer_class = PreferenceSerializer
    
        def get_permissions(self):
            if self.action == 'create' or self.action == 'destroy':
                permission_classes = [IsAuthenticated]
            else: 
                permission_classes = [IsAdminUser]
            return [permission() for permission in permission_classes]
    
        @permission_classes((IsAuthenticated))
        def list(self, request):
            queryset = Preference.objects.all()
            namespace = request.GET.get('namespace', None)
            if namespace:
                 queryset = queryset.filter(user_id=1, namespace=namespace)
            serializer = PreferenceSerializer(queryset, many=True)
            return Response(serializer.data)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-26
      • 2022-12-13
      • 1970-01-01
      • 2020-09-17
      • 2011-05-29
      • 1970-01-01
      • 2021-10-23
      • 2019-07-12
      相关资源
      最近更新 更多