Как использовать параметры запросов фреймворка отдыха Django

Я пытаюсь создать API с помощью Django и мне трудно понять, как работают параметры строки запроса: Пока что я создал конечную точку, которая выдает список продуктов, и я знаю, что хочу иметь возможность фильтровать эти продукты по названию, например /api/Products/name=guitar или любому эквиваленту /api/Products?name=guitar

Я создал это представление и сериализатор:

    serializer_class = ProductSerializer

    def get_queryset(self):
        queryset = ProductJoinShop.objects.raw(f'select * from Product join Shop using (id_shop) limit 12')
        name = self.request.query_params.get('name')
        if name is not None:
            queryset = ProductJoinShop.objects.raw(f'select * from Product join Shop using (id_shop) where name like \'%{name}%\' limit 12')
        return queryset

А это мой urls.py:

router = routers.DefaultRouter()                   
router.register(r'Products', views.ProductView, 'Products')  
router.register(r'Products/(?P<name>.+)/$', views.ProductView, 'ProductsSearch')  

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(router.urls))
]

Это не приводит к сбою, но для /api/Products/guitar/ я ничего не получаю в ответ. Я также попробовал /api/Products/?name=guitar/ и это приводит к ошибке.

Спасибо!

Попробуйте использовать router.register(r'Products/', views.ProductView, 'ProductsSearch')

И затем используйте свой URL, как /api/Products/?name=guitar

Другой возможной ошибкой return queryset должна быть проблема с отступами, где вам нужно правильно расставить отступы.

serializer_class = ProductSerializer

def get_queryset(self):
    queryset = ProductJoinShop.objects.raw(f'select * from Product join Shop using (id_shop) limit 12')
    name = self.request.query_params.get('name')
    if name is not None:
       queryset = ProductJoinShop.objects.raw(f'select * from Product join Shop using (id_shop) where name like \'%{name}%\' limit 12')
       return queryset
Вернуться на верх