使用drf限制基于url的Django Api

2024-09-22 20:19:54 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我想按一个字段过滤我的一个Api模型。为视图构建查询集我需要使用model.objects.all()和模型序列化程序来使用整个模型。一旦我设置了filterset,我想过滤哪个参数

当我直接进行查询时,它会正确过滤,但问题是当我访问过滤器的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']

这些是my 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

这里是url.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'),
]

例如,如果我转到url:localhost:8000/busquedaciudad/?ciudad=somecity,它将正确返回已筛选的对象,但如果我尝试使用localhost:8000/busquedaciudad/它将提供数据库中模型的所有对象,并且如果我将ciudad参数留空,例如:localhost:8000/busquedaciudad/?ciudad=

我想知道的是,如果url是:localhost:8000/busquedaciudad/或localhost:8000/busquedaciudad/?ciudad=返回0个对象,而不是所有对象

有什么想法吗?谢谢


Tags: 对象模型registertruelocalhosturlviewsclass