【问题标题】:Django - Make parameter optionalDjango - 使参数可选
【发布时间】:2020-06-25 04:12:02
【问题描述】:

在我的 urls 文件中,我已经指定了视图的路径 -

urlpatterns = [
    path('users/userdetails', PersonalUserDetailView.as_view(), name='hello'),
    path('stores/<int:store_id>', StoreDetailView.as_view(), name='hello2'),
]

但是,我想将 store_id 设为可选。我该怎么做?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    在视图方法中设置默认参数

    class StoreDetailView(...):
        def get(self, request, store_id=None):
            ...
    
        def post(self, request, store_id=None):
            ...

    另外,您需要稍微更新一下 URL 模式,

    urlpatterns = [
        path('users/userdetails', PersonalUserDetailView.as_view(), name='hello'),
        path('stores/&ltint:store_id>', StoreDetailView.as_view(), name='hello2'),
        path('stores/', StoreDetailView.as_view(), name='hello-default'),
    ]

    【讨论】:

      【解决方案2】:

      可以使用正则表达式非捕获括号,类似问题here

      from django.urls import re_path
      
      
      urlpatterns = [
          ...
          re_path(r'stores/(?:(?P<store_id>\d+)/)?$',StoreDetailView.as_view(), name="hello2"), # non-capture
      ]
      

      【讨论】:

        【解决方案3】:
        class StoreAPIView(APIView):
            def get(self, request, store_id=None):
                if store_id is None:
                   qs = Store.objects.all()
                   return Reponse(.......)
                else:
                   try:
                      store_obj = Store.objects.get(id=store_id)
                      serilized_data = StoreSerializer(store_obj).data
                      return Response(....)
                   except Exception as e:
                      return Response(...)
        

        网址 path('stores/&lt;int:store_id&gt;', StoreAPIView.as_view(), name='hello2')

        您还可以使用更好的视图集:

        from django.shortcuts import get_object_or_404
        from myapps.serializers import StoreSerializer
        from rest_framework import viewsets
        from rest_framework.response import Response
        
        class StoreViewSet(viewsets.ViewSet):
        
            def list(self, request):
                queryset = Store.objects.all()
                serializer = StoreSerializer(queryset, many=True)
                return Response(serializer.data)
        
            def retrieve(self, request, pk=None):
                queryset = Store.objects.all()
                store = get_object_or_404(queryset, pk=pk)
                serializer = StoreSerializer(store)
                return Response(serializer.data)
        

        urls.py

        from myapp.views import StoreViewSet
        from rest_framework.routers import DefaultRouter
        
        router = DefaultRouter()
        router.register(r'stores', UserViewSet, basename='store')
        urlpatterns = router.urls
        

        【讨论】:

          猜你喜欢
          • 2012-12-30
          • 1970-01-01
          • 2018-01-25
          • 1970-01-01
          • 2020-08-23
          • 2018-03-05
          • 2014-02-02
          相关资源
          最近更新 更多