Необязательные параметры в урлах django

Я хочу добиться этого в Django

  1. List all items
  2. Get only one item
def get(self, request, pk, format=None):
    if pk is not None:
         product = self.get_object(pk)
         serializer = ProductSerializer(product)
    else:
         products = Product.objects.all()
         serializer = ProductSerializer(products)
    return Response(serializer.data)

Если pk находится в URL, то берется только один продукт, если нет, то берется весь список.

Как я могу достичь этого в URL? Я делаю следующее

re_path(r"(?P<pk>\d+)", ProductView.as_view(), name="product"),

Но аргумент 'pk' здесь обязателен. Я не хочу, чтобы pk был обязательным, но необязательным.

Заранее спасибо

Определите два пути:

urlpatterns = [
    path('/', ProductView.as_view(), {'pk': None}, name='products'),
    path('<int:pk>/', ProductView.as_view(), name='product'),
    # …
]

Часть {'pk': None} указывает, какое значение передавать.

Альтернативный вариант - сделать pk необязательным, так:

def get(self, request, pk=None, format=None):
    if pk is not None:
         product = self.get_object(pk)
         serializer = ProductSerializer(product)
    else:
         products = Product.objects.all()
         serializer = ProductSerializer(products, many=True)
    return Response(serializer.data)

затем вы снова делаете два пути с:

urlpatterns = [
    path('/', ProductView.as_view(), name='products'),
    path('<int:pk>/', ProductView.as_view(), name='product'),
    # …
]
Вернуться на верх