Фильтрация Django по URL и VIEWS - «Страница не найдена в / collection / ...» - PullRequest
0 голосов
/ 29 сентября 2019

Я успешно перезаписываю все записи для конкретного объекта в Django.

Мой url.py равен path('city/', views.TestListCity.as_view()) От почтальона я просто получаю: http://192.168.99.100:8080/collection/city и он возвращает все записи.Пример:

{
    "id": 3,
    "name": "Bor",
    "region": {
        "id": 2,
        "name": "Sun"
    }
},

Теперь я хочу отфильтровать записи с именем столбца .

Я пробовал это:

urls.py
path('city/(?P<name>.+)/$', views.TestListCity.as_view()),

views.py
class TestListCity(generics.RetrieveAPIView):
    serializer_class = TestListCitySerializer

    def get_queryset(self):
        name = self.kwargs['name']
        return City.objects.filter(name=name)

Я пытаюсь GET:

http://192.168.99.100:8080/collection/city?name=Bor

Но тогда 404:

  <title>Page not found at /collection/city</title>

Я также попробовал второй подход:

urls.py
path('city/<str:name>/', views.TestListCity.as_view())

views.py
class TestListCity(generics.RetrieveAPIView):
    serializer_class = TestListCitySerializer
    queryset = City.objects.all()
    lookup_field = 'name'

Но точно такой же ответ.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Это потому, что вы использовали path() и хотели использовать регулярное выражение (re_path()).

Измените это:

from django.urls import path
path('city/(?P<name>.+)/$', views.TestListCity.as_view()),

на:

from django.urls import re_path
re_path('city/(?P<name>.+)/$', views.TestListCity.as_view()),

Это должно работать.И, возможно, / может быть необязательным, например: 'city/(?P<name>.+)/?$'

0 голосов
/ 29 сентября 2019

Если вы хотите использовать приведенный ниже URL (или его эквивалент), где строка является частью соответствия URL:

path('city/<str:name>/$', views.TestListCity.as_view()),

Затем просто позвоните:

http://192.168.99.100:8080/collection/city/Bor/

Вместоиз:

http://192.168.99.100:8080/collection/city?name=Bor

Более поздний передает Bor в качестве значения параметра name запроса GET, т.е. вам нужно будет использовать что-то вроде name = self.request.GET.get('name'), чтобы получить name параметр.Он не будет частью соответствия URL.

...