gpt4 book ai didi

python - 具有同一对象的多个 View 集和路由器的 Django Rest Framework

转载 作者:太空狗 更新时间:2023-10-29 21:38:57 25 4
gpt4 key购买 nike

我无法使用 Django Rest Framework 为同一对象定义不同的 View 集。以下是基于 DRF 快速入门重现该问题的最小示例。我正在使用 python 3.5 和最新的 DRF。

教程/quickstart/serializers.py

from django.contrib.auth.models import User
from rest_framework import serializers


class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email')

class UserMinimalSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('url', 'username')

教程/quickstart/views.py

from django.contrib.auth.models import User
from rest_framework import viewsets
from tutorial.quickstart.serializers import UserSerializer, UserMinimalSerializer

class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer


class UserMinimalViewSet(viewsets.ModelViewSet):
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserMinimalSerializer

教程/urls.py

from django.conf.urls import url, include
from rest_framework import routers
from tutorial.quickstart import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'users-minimal', views.UserMinimalViewSet)

urlpatterns = [
url(r'^', include(router.urls))
]

当运行服务器并获取根目录时,您最终会得到:

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

{
"users": "http://127.0.0.1:8000/users-minimal/",
"users-minimal": "http://127.0.0.1:8000/users-minimal/"
}

注意 usersusers-minimal 都指向 .../users-minimal/

此外,当访问 http://HOST:PORT/users/ 时,您会得到:

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

{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"url": "http://127.0.0.1:8000/users-minimal/2/",
"username": "user2",
"email": "user2@users.com"
},
{
"url": "http://127.0.0.1:8000/users-minimal/1/",
"username": "user1,
"email": "user1@users.com"
}
]
}

注意 url 指向 .../users-minimal/

最后说明:我的问题有点类似于 this one ,但建议的解决方案对我不起作用,也没有说明为什么它应该首先起作用。

最佳答案

简答:您必须将 basename 参数添加到您到 users-minimal 的路由中:

router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
router.register(r'users-minimal', UserMinimalViewSet, basename='usersminimal')

通常,DRF 会从您的queryset 自动生成一个basename。这在 DRF routers docs 中有解释。 , 搜索 basename

您的两个 Viewset 使用相同的 queryset 因此它们最初具有相同的 basename。这会导致您所看到的问题,即后来注册的 ViewSet 将覆盖之前注册的 ViewSet 的路由。当您在示例中更改 router.register 的顺序时,您可以看到这一点。

当您直接在 shell 中测试代码时,您可以看到路由的基本名称:

from rest_framework import routers
from tutorial.quickstart import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'users-minimal', views.UserMinimalViewSet)


> routers.urls
[<RegexURLPattern user-list ^minimal/$>,
<RegexURLPattern user-list ^minimal\.(?P<format>[a-z0-9]+)/?$>,
<RegexURLPattern user-detail ^minimal/(?P<pk>[^/.]+)/$>,
<RegexURLPattern user-detail ^minimal/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$>,
<RegexURLPattern user-list ^users/$>,
<RegexURLPattern user-list ^users\.(?P<format>[a-z0-9]+)/?$>,
<RegexURLPattern user-detail ^users/(?P<pk>[^/.]+)/$>,
<RegexURLPattern user-detail ^users/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$>,
<RegexURLPattern api-root ^$>,
<RegexURLPattern api-root ^\.(?P<format>[a-z0-9]+)/?$>]

关于python - 具有同一对象的多个 View 集和路由器的 Django Rest Framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40758373/

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