Mar*_*ies 9 django django-rest-framework
我正在尝试使用DRF 3.1创建API.我首先使用ModelViewSet创建管理功能并使用DefaultRouter注册这些功能.这非常有效,默认API根视图在浏览器中查看时生成了相应的链接.然后,我使用ReadOnlyModelViewSet为标准用户创建了更多受限制的视图集,当我尝试使用路由器注册这些受限制的视图集时出现问题,因为ReadOnlyModelViewSets似乎覆盖了API根视图上的链接.生成的URL在键入浏览器时似乎有效,但API根视图上的链接并不像我预期的那样
serializers.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')
Run Code Online (Sandbox Code Playgroud)
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,)
Run Code Online (Sandbox Code Playgroud)
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))
]
Run Code Online (Sandbox Code Playgroud)
这会产生这样的默认API根视图
{
"manangeunits": "http://localhost:8000/readunits/",
"readunits": "http://localhost:8000/readunits/",
}
Run Code Online (Sandbox Code Playgroud)
而我正在寻找的是这个
{
"manangeunits": "htt://localhost:8000/manageunits/",
"readunits": "htt://localhost:8000/readunits/",
}
Run Code Online (Sandbox Code Playgroud)
当地址输入浏览器时,网址"htt:// localhost:8000/manageunits /"是有效且可访问的,它不会出现在API根视图中
任何帮助将不胜感激
Dar*_*ger 10
我有同样的问题,幸运的是找到了解决方案.
将urls.py扩展如下:
router.register(r'manangeunits', views.AdminUnitViewSet, base_name='manangeunits')
router.register(r'readunits', views.UserUnitViewSet, base_name='readunits')
Run Code Online (Sandbox Code Playgroud)
我不知道这背后的魔力,但它对我有用:)
| 归档时间: |
|
| 查看次数: |
2407 次 |
| 最近记录: |