【问题标题】:Django Rest Framework - URL Queries Not Working?Django Rest Framework - URL 查询不起作用?
【发布时间】:2020-07-02 18:03:48
【问题描述】:

我正在用 Django 编写一个使用 Django Rest 框架的应用程序。对 API URL 的 GET 请求有效,但是当我向其添加查询时,例如 '?id=1845' 它实际上并没有执行查询,它仍然返回完整的结果列表。

在下面的代码中,我尝试查询“指标列表”

views.py

from django.shortcuts import render
from django.http import JsonResponse

from rest_framework.decorators import api_view
from rest_framework.response import Response
from .serializers import IndicatorSerializer

from data_platform.models import Indicator

@api_view(['GET'])
def apiOverview(request):
    api_urls = {
        'Indicator List':'/indicator-list/',
        'Indicator Detail':'/indicator-detail/<str:pk>/',
    }
    return Response(api_urls)

@api_view(['GET'])
def indicatorList(request):
    indicators = Indicator.objects.all()
    serializer = IndicatorSerializer(indicators, many=True)
    #filterset_fields = ('id')
    #filter_backends = [DjangoFilterBackend]
    return Response(serializer.data)

@api_view(['GET'])
def indicatorDetail(request, pk):
    indicators = Indicator.objects.get(id=pk)
    serializer = IndicatorSerializer(indicators, many=False)
    return Response(serializer.data)

urls.py

from django.urls import include, path
from . import views

urlpatterns = [
    path('', views.apiOverview, name="api-overview"),
    path('indicator-list/', views.indicatorList, name="indicator-list"),
    path('indicator-detail/<str:pk>/', views.indicatorDetail, name="indicator-detail"),
]

序列化器.py

from rest_framework import serializers
from data_platform.models import Indicator

class IndicatorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Indicator
        fields = '__all__'

【问题讨论】:

  • 我认为您不应该将 id 作为 queryString ``` '?id=1845'``` 传递,您应该将其添加到 URL 的末尾,例如 /indicator-detail/id
  • 尝试 localhost:8000/api/indicator-list/1845 而不指定 id 关键字,但还要确保列出所有指标的视图支持列出单个指标,否则您将不得不使用指标详细视图表示 URL 将更改为 localhost:8000/api/indicator-detail/1845
  • 另外,详细的网址不需要有那个斜线,我会设置为indicator-detail/&lt;str:pk&gt;而不是indicator-detail/&lt;str:pk&gt;/
  • 都试过了,还是不行

标签: python django api rest django-rest-framework


【解决方案1】:

我想通了!我不得不使用类视图而不是函数视图

class indicatorList(generics.ListAPIView):
queryset = Indicator.objects.all()   
serializer_class = IndicatorSerializer
filter_backends = [django_filters.rest_framework.DjangoFilterBackend]
filter_fields = ('id',)

并将“django_filters”添加到 INSTALLED_APPS

【讨论】:

    猜你喜欢
    • 2021-05-31
    • 2019-09-15
    • 2019-09-04
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2019-03-29
    • 1970-01-01
    相关资源
    最近更新 更多