我正在尝试使用drf-nested-routes
模块和 Django Rest Framework 显示 2 级或更多级别的嵌套路由的 url。当它只有一层时我没有问题(即使用 获取路线parent_lookup_kwargs
),但是当我尝试更深入时收到以下错误:
/en/api/v1.0/Sensors(1)/Datastreams(1)/Things 'RelatedManager' 对象的 AttributeError 没有属性 'Sensors'
以下是一些相关的序列化程序:
class ThingSerializer(SelectSerializerMixin,
ExpanderSerializerMixin,
serializers.ModelSerializer):
class Meta:
model = Thing
fields = ('@iot.id',
'@iot.selfLink',
'Locations@iot.navigationLink',
...
ThingSerializer._declared_fields["Datastreams@iot.navigationLink"] = \
NestedHyperlinkedIdentityField(
view_name='sensor-location-list',
parent_lookup_kwargs={'Sensors_pk':'Datastreams__Sensors__pk',
'nested_2_pk': 'Datastreams__pk'},
lookup_url_kwarg='nested_3_pk'
)
我正在尝试显示相关字段的 url。以下是可用的 url 路由:
en/ api/v1.0/ ^Sensors\((?P<Sensors_pk>[^/.]+)\)/Datastreams\((?P<nested_2_pk>[^/.]+)\)/Things\((?P<nested_3_pk>[^/.]+)\)/Locations$ [name='sensor-location-list']
en/ api/v1.0/ ^Sensors\((?P<Sensors_pk>[^/.]+)\)/Datastreams\((?P<nested_2_pk>[^/.]+)\)/Things\((?P<nested_3_pk>[^/.]+)\)/HistoricalLocations$ [name='sensor-historicallocation-list']
路由已注册,我可以访问嵌套资源没问题。只有当我尝试创建NestedHyperlinkedIdentityField
失败的资源时。
注意,如果我Many=True
在 NestedHyperlinkedIdentityField 中使用并更改source
字段使其不超过 1 个父级深度,我可以让它工作:
NestedHyperlinkedIdentityField(
view_name='sensor-location-list',
many=True,
source='Datastreams',
parent_lookup_kwargs={'Sensors_pk': 'Sensors__pk',
'nested_2_pk': 'pk'},
lookup_url_kwarg='nested_3_pk'
)
但是,这会创建一个ManyRelatedField
对象,因此序列化的输出是:
"Locations@iot.navigationLink": [
"http://localhost:8000/en/api/v1.0/Sensors(1)/Datastreams(1)/Things(1)/Locations"
],
所需的输出是:
"Locations@iot.navigationLink": "http://localhost:8000/en/api/v1.0/Sensors(1)/Datastreams(1)/Things(1)/Locations",
任何帮助将不胜感激^^。
编辑:当序列化程序中使用的模型是父级的反向关系时,它似乎不会获取 url。您可以在以下部分看到这一点models.py
:
class DataStream(models.Model):
....
Things = models.ForeignKey(Thing,
on_delete=models.SET_NULL,
null=True,
related_name="Datastreams"
Sensors = models.ForeignKey(Sensor,
on_delete=models.SET_NULL,
...