我正在使用Django Rest Framework来创建API。有一些模型类,例如City
,它们通过API公开。现在我创建了一个utils
模块,其中包含一些有用的方法:
# city/utils.py
def distance_between_cities(city1, city2):
return city1.distance(city2)
我想将示例方法distance_between_cities
公开为API端点。所以我开始创建一个视图:
# city/views.py
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from . import utils
class DistanceView(APIView):
def get(self, request, format=None):
city1 = request.query_params.get('city1', None)
city2 = request.query_params.get('city2', None)
distance = utils.distance_between_cities(city1, city2)
distance_hash = {'distance': distance}
return Response(distance_hash, status=status.HTTP_200_OK)
然后我尝试注册路线:
# city/urls.py
from rest_framework.routers import DefaultRouter
from . import views
router = DefaultRouter()
router.register(r'distance', views.DistanceView)
当我访问该网站时,会显示以下错误:
未指定
base_name
参数,并且无法自动确定视图集中的名称,因为它没有.queryset
属性。
我希望看到DRF呈现的网站中的端点与其他(模型相关的)端点类似。
最后,我想通过以下方式访问端点:
http://localhost:8000/api/cities/distance.json?city1=23&city1=42
我尝试通过 curl 检查API:
$ curl -X HEAD -i http://localhost:8000/api/cities/distance.json?city1=23&city2=42
这是响应标题:
HTTP/1.0 404 NOT FOUND
Date: Fri, 09 Oct 2015 16:45:06 GMT
Server: WSGIServer/0.2 CPython/3.4.3
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
Vary: Accept, Cookie
Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS
答案 0 :(得分:4)
如果您需要列出新的入口点,则需要从ViewSet继承(请注意,我不是在谈论ModelViewSet)。
我在这里写了一篇简短的指南+示例项目:https://medium.com/@linovia/django-rest-framework-viewset-when-you-don-t-have-a-model-335a0490ba6f
您不需要所有ViewSet方法,可能只是根据您的评论列出的方法。
答案 1 :(得分:0)
django-rest-framework只能确定ViewSets的url映射。因此,您可以手动映射网址,就像使用默认的django应用程序一样。
<强> urls.py 强>
urlpatterns = [
url(r'distance', views.DistanceView),
]