Ограничить базу URL Django Api с помощью drf - PullRequest
1 голос
/ 09 мая 2020

Привет, я хочу отфильтровать одну из моих моделей Api по одному полю. При создании набора запросов для представления мне нужно использовать всю модель, используя model.objects.all () и сериализатор модели. После того, как я установил набор фильтров, параметр, который я хочу фильтровать.

Он правильно фильтрует, когда я обращаюсь напрямую, но проблема в том, что когда я обращаюсь к URL-адресу для фильтра, он по умолчанию показывает мне все элементы этих моделей, и если я ищу элемент, который не существует, он также показывает все элементы.

Это мои serializers.py для полной модели и отфильтрованные.

class EstacionSerializer(serializers.ModelSerializer):
    pistas = PistaSerializer(read_only=True, many=True)
    forfaits = ForfaitSerializer(read_only=True, many=True)
    #owner = serializers.ReadOnlyField(source='owner.username')

    class Meta:
        model = Estacion
        fields = ['nombre', 'ciudad', 'pais', 'descripcion',
                  'pistas', 'forfaits', 'km_esquiables', 'distancia_ciudad']


class EstacionBycFilterSet(filters.FilterSet):
    class Meta:
        model = Estacion
        fields = ['ciudad']

Те это мой views.py, где используется полный сериализатор и отфильтрованный.

class EstacionViewSet(viewsets.ModelViewSet):
    queryset = Estacion.objects.all()
    serializer_class = EstacionSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly,]


class EstacionByCiudad(viewsets.ModelViewSet):
    queryset = Estacion.objects.all()
    serializer_class = EstacionSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly,]
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_class = EstacionPorCiudadFilterSet

Вот urls.py

router = routers.DefaultRouter()
router.register(r'estaciones', views.EstacionViewSet, basename='estaciones')
router.register(r'pistas', views.PistaViewSet, basename='pistas')
router.register(r'forfaits', views.ForfaitViewSet, basename='forfaits')
router.register(r'busquedaciudad', views.EstacionByCiudad, basename='EstbyCiudad')
from rest_framework.authtoken import views

urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', views.obtain_auth_token, name='ap-auth'),
]

Например, если я go на URL : localhost: 8000 / busquedaciudad /? ciudad = somecity он возвращает мне правильно отфильтрованные объекты, но если я попробую localhost: 8000 / busquedaciudad /, он даст мне все объекты модели в базе данных, а также если я оставил параметр ciudad пустым, например : localhost: 8000 / busquedaciudad /? ciudad =

И я хочу, чтобы URL-адрес был похож на: localhost: 8000 / busquedaciudad / или localhost: 8000 / busquedaciudad /? ciudad = re повернуть 0 объектов вместо всех.

Есть идеи? Спасибо

...