使用django休息框架的自定义URL [英] custom URLs using django rest framework
问题描述
我正在尝试使用django休息框架来将我的模型公开为API。
序列化器
class UserSerializer(serializers.HyperlinkedModelSerializer):
/ pre>
class Meta:
model = User
视图集
UserViewSet(viewsets.ModelViewSet):
用户详细信息和列表的$ API
serializer_class = UserSerializer
queryset = User.objects。全部()
路由器
router.register(r'users',views.UserViewSet)
虽然这暴露了/ users /和users /,我希望我的URL也包括一个用户slug,像/ users / 1 / xyz-user-name。
有人解决了这个问题吗?这是否需要在视图和路由器代码中进行更改,还是只能在路由器代码中进行配置?我的slug不是真的用于确定URL路由,它只适用于URL可读性。
任何指针?
解决方案我可以通过使用这里发布的方法来获得这个工作。
django-rest-framework具有多个查询参数的HyperlinkedIdentityField
我收到的第二个错误是因为我在meta部分中包含了url定义。它应该在meta部分之前。我还必须在视图集代码中指定查找字段。以下是我的代码的相关部分。
urls.py
from user.views import UserViewSet
user_list = UserViewSet.as_view({'get':'list'})
user_detail = UserViewSet.as_view({'get':'检索'})
urlpatterns = [
url(r'^ users / $',user_list,name ='user-list'),
url(r'^ user /(?P< id> \d +)/(?P< slug> [ - \w\d] +)/ $',user_detail,name ='user-detail'),
url r'^ api-auth /',include('rest_framework.urls',namespace ='rest_framework'))
]
views.py:
class UserViewSet(viewsets.ModelViewSet)
用户详细信息和用户列表的API终点
lookup_field ='id'
serializer_class = UserSerializer
queryset = user.objects.all()
serializers.py
$ b $
$ b url = ParameterisedHyperlinkedIdentityField(view_name ='user-detail',lookup_fields =(('id','id'), ('slug','slug')),read_only = True
class Meta:
model = user
fields =('url','name','cover_photo ')
I am trying to use the django rest framework to expose my models as APIs.
serializers
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
viewset
class UserViewSet(viewsets.ModelViewSet):
"""
API end point for User details and list
"""
serializer_class = UserSerializer
queryset = User.objects.all()
routers
router.register(r'users',views.UserViewSet)
While this exposes /users/ and users/, I want my URLs to include a user-slug as well, something like /users/1/xyz-user-name.
Has anyone solved this problem? Does this need changes in both the viewset and router code or is it something that can be configured only in the router code? MY "slug" isn't really used for determining url routing, it is only for URL readability.
Any pointers?
I was able to get this to work by using the approach posted here.
django-rest-framework HyperlinkedIdentityField with multiple lookup args
The second error I was receiving was becuase I was including the url definition inside the meta section. It should be before the meta section instead. I also had to specify the lookup field in the viewset code. Here are the relevant parts of my code.
urls.py
from user.views import UserViewSet
user_list = UserViewSet.as_view({'get':'list'})
user_detail = UserViewSet.as_view({'get':'retrieve'})
urlpatterns= [
url(r'^users/$', user_list, name='user-list'),
url(r'^user/(?P<id>\d+)/(?P<slug>[-\w\d]+)/$', user_detail, name='user-detail'),
url(r'^api-auth/', include('rest_framework.urls',namespace = 'rest_framework'))
]
views.py:
class UserViewSet(viewsets.ModelViewSet):
"""
API end point for user details and user list
"""
lookup_field = 'id'
serializer_class = UserSerializer
queryset = user.objects.all()
serializers.py
class UserSerializer(serializers.HyperlinkedModelSerializer):
url = ParameterisedHyperlinkedIdentityField(view_name='user-detail', lookup_fields=(('id', 'id'), ('slug', 'slug')), read_only=True)
class Meta:
model = user
fields = ('url','name','cover_photo')
这篇关于使用django休息框架的自定义URL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!