使用django rest framework

时间:2015-08-24 12:04:20

标签: python django routing django-rest-framework

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

串行

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

视图集

class UserViewSet(viewsets.ModelViewSet):
    """
    API end point for User details and list
    """
    serializer_class = UserSerializer
    queryset = User.objects.all()

路由器

router.register(r'users',views.UserViewSet)

虽然这会暴露/ users /和users /,但我希望我的URL也包含一个user-slug,比如/ users / 1 / xyz-user-name。

有没有人解决过这个问题?这是否需要在视图集和路由器代码中进行更改,还是只能在路由器代码中配置?我的“slug”并不真正用于确定url路由,它仅用于URL可读性。

任何指针?

2 个答案:

答案 0 :(得分:4)

您应该在序列化程序和视图集中设置lookup_field属性。

在serializers.py中:

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'user_slug')
        lookup_field = 'user_slug'
        extra_kwargs = {
            'url': {'lookup_field': 'user_slug'}
        }

在viewsets.py中:

class UserViewSet(viewsets.ModelViewSet):
    serializer_class = UserSerializer
    queryset = User.objects.all()
    lookup_field = ('user_slug')

答案 1 :(得分:3)

我能够通过使用此处发布的方法来实现这一目标。

django-rest-framework HyperlinkedIdentityField with multiple lookup args

我收到的第二个错误是因为我在meta部分中包含了url定义。它应该在meta部分之前。我还必须在视图集代码中指定查找字段。以下是我的代码的相关部分。

<强> 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')