使用具有嵌套HyperlinkedIdentityFields的drf-nested-routers

时间:2017-09-29 09:58:19

标签: django django-rest-framework drf-nested-routers

我正在尝试使用drf-nested-routes包在序列化程序中生成嵌套的HATEOAS链接。我目前的设置如下:

/resource_a/<pk>
/resource_a/<pk>/resource_b/<pk>
/resource_a/<pk>/resource_b/<pk>
/resource_a/<pk>/resource_b/<pk>/resource_c

我无法创建指向最后一条路线的HyperlinkedIdentityField。根据文档,可以创建如下的超链接字段:

nameservers = HyperlinkedIdentityField(
    view_name='domain-nameservers-list',
    lookup_url_kwarg='domain_pk'
)

或者

nameservers = NestedHyperlinkedRelatedField(
    many=True,
    read_only=True,   # Or add a queryset
    view_name='domain-nameservers-detail'
    parent_lookup_url_kwargs={'domain_pk': 'domain__pk'}
)

但是,当尝试访问URL层次结构中2层深的资源时,这些方法会失败。第一种方法不兼容,因为它不允许添加第二个lookup_url_kwarg,而对于第二种方法,它在使用(在我看来)正确配置时抛出异常(ImproperlyConfigured)属性(resource_a__pkresource_b__pk)。

这个套餐有可能吗?否则,我将使用SerializerMethodField

采用更简单的解决方案
resource_c = serializers.SerializerMethodField()

def get_resource_c(self, obj):
        url = reverse('resource_b-resource_c-list', kwargs=dict(resource_a_pk=obj.resource_a.pk, resource_b_pk=obj.pk))
        return self.context['request'].build_absolute_uri(url)

提前致谢!

1 个答案:

答案 0 :(得分:1)

我在使用NestedHyperlinkedRelatedField之前已经这样做了,这绝对有效。我的猜测是你的配置不正确。我注意到的一件事是你使用parent_lookup_url_kwargs而在我的情况下我使用parent_lookup_kwargs。

根据您的解释,我认为它需要看起来像这样

NestedHyperlinkedRelatedField(..., 
    parent_lookup_kwargs={
          'resource_a_pk': '<how to reach resource_a pk from resource_b>'})