gpt4 book ai didi

Django-Rest-Framework 路由器寄存器

转载 作者:行者123 更新时间:2023-12-05 08:43:17 24 4
gpt4 key购买 nike

当我尝试使用 Django-REST-FRAMEWORK 注册超过 2 个路由器时遇到问题。请看看我的例子:

urls.py

from rest_framework import routers
from collaborativeAPP import views

router = routers.DefaultRouter()
router.register(r'get_vocab', views.VocabViewSet)
router.register(r'get_term', views.TermViewSet)
router.register(r'get_discipline', views.DisciplineViewSet)

urlpatterns = patterns(
...
url(r'^service/', include(router.urls))
)

views.py

class VocabViewSet(viewsets.ModelViewSet):
queryset = Vocab.objects.all()
serializer_class = VocabSerializer

class TermViewSet(viewsets.ModelViewSet):
queryset = Term.objects.all()
serializer_class = TermSerializer

class DisciplineViewSet(viewsets.ModelViewSet):
queryset = Vocab.objects.filter(kwdGroup=4)
serializer_class = DisciplineSerializer

我本地主机的结果如下:

http://localhost:8000/service/

HTTP 200 OK
Content-Type: application/json
Vary: Accept
Allow: GET, HEAD, OPTIONS

{
"get_vocab": "http://127.0.0.1:8000/service/get_discipline/",
"get_term": "http://127.0.0.1:8000/service/get_term/",
"get_discipline": "http://127.0.0.1:8000/service/get_discipline/"
}

如您所见,我已经注册了 3 个路由器,期望它们将为每个方法名称显示 3 个 url(get_vocabget_termget_discipline) .最终结果是 get_discipline 出现了两次并且缺少 get_vocab url。

请注意,对于使用不同模型的方法,它工作正常,但在 get_discipline 和 get_vocab 的情况下,它们使用相同的模型,这将造成这种困惑。我应该为每个模型使用一个 View 集吗?如果是这样,如何在 View 集中定义不同的方法?

应该会出现以下结果:

 HTTP 200 OK
Content-Type: application/json
Vary: Accept
Allow: GET, HEAD, OPTIONS

{
"get_vocab": "http://127.0.0.1:8000/service/get_vocab/",
"get_term": "http://127.0.0.1:8000/service/get_term/",
"get_discipline": "http://127.0.0.1:8000/service/get_discipline/"
}

我错过了什么?我想我可以注册任意数量的路由器。每个型号应该有一个路由器?为什么似乎不适用于共享同一模型的 View 集?

最佳答案

尝试向每个已注册的 View 集显式添加一个 base_name:

router = routers.DefaultRouter()
router.register(r'vocabs', views.VocabViewSet, 'vocabs')
router.register(r'terms', views.TermViewSet, 'terms')
router.register(r'disciplines', views.DisciplineViewSet, 'disciplines')

作为旁注,您应该在您的网址中排除 get_ 前缀,因为那不是 RESTful。每个 URL 都应该指定一个资源,而不是对该资源的操作。这就是 HTTP 动词的用途:

GET http://127.0.0.1:8000/service/vocabs/

# or this to create resource
POST http://127.0.0.1:8000/service/vocabs/

...

关于Django-Rest-Framework 路由器寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31291072/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com