HyperlinkedRelatedField DRF

时间:2016-11-23 11:17:33

标签: python django django-rest-framework

在DRF中使用HyperlinkedRelatedField,如果使用标准路由器,则需要提供view_name作为参数,通常为{model_name}-detail

但是,如果你没有使用standard routers,那意味着我已经定义了自定义路由器,那么这个视图名称在这种情况下如何工作?

我的网址看起来像这样:

# venue routers
venue_detail = venues.VenueViewSet.as_view({
    'get': 'retrieve',
})

venue_list = venues.VenueViewSet.as_view({
    'get': 'list',
    'post': 'add_venue'
})

urlpatterns = [

    # venue urls
    url(r'^organization/(?P<organization_id>[0-9]+)/venue/$', 
        venue_list, 
        name='venue-list'),

    url(r'^organization/(?P<organization_id>[0-9]+)/venue/$', 
        venue_list, 
        name='venue-add'),

    url(r'^organization/(?P<organization_id>[0-9]+)/venue/(?P<pk>[0-9]+)/$', 
        venue_detail, 
        name='venue-detail'),

]

序列化程序:

class MemberSerializer(serializers.HyperlinkedModelSerializer):
    venue = serializers.HyperlinkedRelatedField(queryset=Venue.objects.all(), view_name='venue-detail')

    class Meta:
        model = members.Members
        fields = ['id', 'venue', 'extra_info']

1 个答案:

答案 0 :(得分:0)

这不会起作用,因为默认序列化程序不会知道organization_id是什么,因此不会与关联的网址匹配。

首先,我建议使用嵌套路由器或路径。 如果要查看给定组织的所有场地,则应使用filters。例如:

https://xxxx/api/venue/?organization=somecorp

如果您仍想使用嵌套路由器,则应尝试使用nested routers app

或者,您需要覆盖序列化程序get_url以提供organization_id