在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']
答案 0 :(得分:0)
这不会起作用,因为默认序列化程序不会知道organization_id
是什么,因此不会与关联的网址匹配。
首先,我建议不使用嵌套路由器或路径。 如果要查看给定组织的所有场地,则应使用filters。例如:
https://xxxx/api/venue/?organization=somecorp
如果您仍想使用嵌套路由器,则应尝试使用nested routers app。
或者,您需要覆盖序列化程序get_url
以提供organization_id
。