Django-使参数可选

Django-使参数可选,django,django-rest-framework,Django,Django Rest Framework,在我的URL文件中,我指定了视图的路径- urlpatterns = [ path('users/userdetails', PersonalUserDetailView.as_view(), name='hello'), path('stores/<int:store_id>', StoreDetailView.as_view(), name='hello2'), ] urlpatterns=[ 路径('users/userdetails',PersonalUse

在我的URL文件中,我指定了视图的路径-

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

但是,我想让
存储id
成为可选的。如何操作?

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

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

    def post(self, request, store_id=None):
        ...
class StoreDetailView(…):
def get(self、request、store_id=None):
...
def post(自我、请求、存储标识=无):
…
另外,您需要稍微更新URL模式

urlpatterns = [
    path('users/userdetails', PersonalUserDetailView.as_view(), name='hello'),
    path('stores/<int:store_id>', StoreDetailView.as_view(), name='hello2'),
    path('stores/', StoreDetailView.as_view(), name='hello-default'),
]
urlpatterns=[
路径('users/userdetails',PersonalUserDetailView.as_view(),name='hello'),
路径('stores/<int:store\u id>',StoreDetailView.as\u view(),name='hello2'),
路径('stores/',StoreDetailView.as_view(),name='hello-default'),

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

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

    def post(self, request, store_id=None):
        ...
class StoreDetailView(…):
def get(self、request、store_id=None):
...
def post(自我、请求、存储标识=无):
…
另外,您需要稍微更新URL模式

urlpatterns = [
    path('users/userdetails', PersonalUserDetailView.as_view(), name='hello'),
    path('stores/<int:store_id>', StoreDetailView.as_view(), name='hello2'),
    path('stores/', StoreDetailView.as_view(), name='hello-default'),
]
urlpatterns=[
路径('users/userdetails',PersonalUserDetailView.as_view(),name='hello'),
路径('stores/<int:store\u id>',StoreDetailView.as\u view(),name='hello2'),
路径('stores/',StoreDetailView.as_view(),name='hello-default'),

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

从django.url导入重新路径
URL模式=[
...
re_path(r'stores/(?:(?P\d+)/)?$”,StoreDetailView.as_view(),name=“hello2”),#非捕获
]

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

从django.url导入重新路径
URL模式=[
...
re_path(r'stores/(?:(?P\d+)/)?$”,StoreDetailView.as_view(),name=“hello2”),#非捕获
]
URL
path('stores/',storeapieview.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)
url.py

from myapp.views import StoreViewSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'stores', UserViewSet, basename='store')
urlpatterns = router.urls
URL
path('stores/',storeapieview.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)
url.py

from myapp.views import StoreViewSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'stores', UserViewSet, basename='store')
urlpatterns = router.urls