0

我正在尝试使用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,
                                ...
4

0 回答 0