使用django休息框架的自定义URL [英] custom URLs using django rest framework

查看:314
本文介绍了使用django休息框架的自定义URL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用django休息框架来将我的模型公开为API。



序列化器

  class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
/ pre>

视图集

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆