将 drf-nested-routers 与嵌套的 HyperlinkedIdentityFields 一起使用
Using drf-nested-routers with nested HyperlinkedIdentityFields
我正在尝试使用 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__pk
, resource_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)
提前致谢!
我在使用 NestedHyperlinkedRelatedField
之前已经这样做了,它确实有效。我的猜测是您的配置不正确。我注意到的一件事是您使用 parent_lookup_url_kwargs,而在我的情况下我使用 parent_lookup_kwargs。
根据您的解释,我认为它需要看起来像这样
NestedHyperlinkedRelatedField(...,
parent_lookup_kwargs={
'resource_a_pk': '<how to reach resource_a pk from resource_b>'})
我正在尝试使用 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__pk
, resource_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)
提前致谢!
我在使用 NestedHyperlinkedRelatedField
之前已经这样做了,它确实有效。我的猜测是您的配置不正确。我注意到的一件事是您使用 parent_lookup_url_kwargs,而在我的情况下我使用 parent_lookup_kwargs。
根据您的解释,我认为它需要看起来像这样
NestedHyperlinkedRelatedField(...,
parent_lookup_kwargs={
'resource_a_pk': '<how to reach resource_a pk from resource_b>'})