【问题标题】:Django Rest Framework Routers with multiple viewsets具有多个视图集的 Django Rest 框架路由器
【发布时间】:2015-05-29 15:54:38
【问题描述】:

我正在尝试使用 DRF 3.1 创建 API。我首先使用 ModelViewSet 创建管理函数并将它们注册到 DefaultRouter。这非常有效,并且默认 API 根视图在浏览器中查看时会生成适当的链接。然后,我使用 ReadOnlyModelViewSet 为标准用户创建了更多受限视图集,当我尝试向路由器注册这些受限视图集时出现问题,因为 ReadOnlyModelViewSets 似乎覆盖了 API 根视图上的链接。生成的 url 在浏览器中输入时似乎可以工作,但 API 根视图上的链接与我预期的不同

序列化器.py

class AdminUnitSerializer(serializers.HyperlinkedModelSerializer):
'''
model serializer for admin users containing all fields

'''

url = HyperlinkedIdentityField(view_name='unit-detail')

class Meta:
    model = Unit
    fields = ('url', 'id', 'name', 'symbol', 'converters_from', 'converters_to')

class UserUnitSerializer(serializers.HyperlinkedModelSerializer):
'''
model serializer for standard users containing restricted set of fields

'''

url = HyperlinkedIdentityField(view_name='unit-detail')

class Meta:
    model = Unit
    fields = ('url', 'id', 'name', 'symbol')

views.py

class AdminUnitViewSet(viewsets.ModelViewSet):
'''
simple viewset providing CRUD operations on unit objects

'''

queryset = models.Unit.objects.all()
serializer_class = serializers.AdminUnitSerializer
permission_classes = (permissions.IsAdminUser,)

class UserUnitViewSet(viewsets.ReadOnlyModelViewSet):
'''
read only view set providing list and detail views for unit objects

'''

queryset =  models.Unit.objects.all()
serializer_class = serializers.UserUnitSerializer
permission_classes(permissions.IsAuthenticated,)

urls.py

router.register(r'manangeunits', views.AdminUnitViewSet)
router.register(r'readunits', views.UserUnitViewSet)

urlpatterns = [
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^rest-auth/', include('rest_auth.urls')),
url(r'^', include(router.urls))
]

这会产生一个像这样的默认 API 根视图

{
"manangeunits": "http://localhost:8000/readunits/",
"readunits": "http://localhost:8000/readunits/",
}

而我正在寻找的是这个

{
"manangeunits": "htt://localhost:8000/manageunits/",
"readunits": "htt://localhost:8000/readunits/",
}

url 'htt://localhost:8000/manageunits/' 在浏览器中输入地址时有效且可访问,它只是不会出现在 API 根视图中

任何帮助将不胜感激

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    我遇到了同样的问题,幸运的是找到了解决方案。

    将您的 urls.py 扩展如下:

    router.register(r'manangeunits', views.AdminUnitViewSet, base_name='manangeunits')
    router.register(r'readunits', views.UserUnitViewSet, base_name='readunits')
    

    我不知道这背后的魔力,但它对我有用:)

    【讨论】:

      【解决方案2】:

      Dario Behringer 的答案是正确的。但这不仅仅是魔法。

      重要的部分是添加显式base_name。通常 DRF 会从您的查询集中自动生成一个base_name。这在“base_name”下进行了解释:www.django-rest-framework.org/api-guide/routers/。 AdminUnitViewSetUserUnitViewSet 的查询集内部是一样的。

      这导致在没有明确新的base_name注册时,后注册的ViewSet会覆盖之前注册的ViewSet

      base_name 负责在 Django 中创建命名 URL。如果有多个同名的命名 URL,Django 基本上只会考虑最新定义的:https://docs.djangoproject.com/en/1.10/topics/http/urls/#naming-url-patterns

      与问题Django Rest Framework with multiple Viewsets and Routers for the same object中解释的问题基本相同

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-20
        • 2017-04-07
        • 1970-01-01
        • 2013-09-28
        相关资源
        最近更新 更多