Je tente de générer des liens HATEOAS imbriqués dans un sérialiseur en utilisant le package drf-nested-routes. Ma configuration actuelle serait comme suit:Utilisation de drf-imbriqués-routeurs avec HyperlinkedIdentityFields imbriqués
/resource_a/<pk>
/resource_a/<pk>/resource_b/<pk>
/resource_a/<pk>/resource_b/<pk>
/resource_a/<pk>/resource_b/<pk>/resource_c
Je suis incapable de créer un HyperlinkedIdentityField
qui pointe vers la dernière route. Selon la documentation, on peut créer des champs liens hypertextes comme ceci:
nameservers = HyperlinkedIdentityField(
view_name='domain-nameservers-list',
lookup_url_kwarg='domain_pk'
)
Ou
nameservers = NestedHyperlinkedRelatedField(
many=True,
read_only=True, # Or add a queryset
view_name='domain-nameservers-detail'
parent_lookup_url_kwargs={'domain_pk': 'domain__pk'}
)
Mais ces approches ne parviennent pas en essayant d'atteindre une ressource qui est de 2 couches profondes dans la hiérarchie des URL. La première méthode n'est pas compatible, car elle ne permet pas d'ajouter une deuxième lookup_url_kwarg
, et comme pour la seconde, elle lance une exception (ImproperlyConfigured
) lors de la configuration avec les attributs (à mon avis) appropriés (resource_a__pk
, resource_b__pk
).
Est-ce possible avec ce forfait? Sinon, je vais recourir à une solution plus simple en utilisant un 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)
Merci à l'avance!
De mon expérience, il y a des problèmes lorsque vous enregistrez votre URL comme '/ resource_a//resource_b//resource_c' et que vous voulez pour l'utiliser dans un appel inverse. Avez-vous dupliqué la balise '' dans votre URL? –
Je n'ai pas enregistré les URL comme ça, c'était le schéma API résultant. J'ai fondamentalement suivi l'exemple dans le [docs] (https://github.com/alanjds/drf-nested-routers/#quickstart) – martinarroyo
Pouvez-vous ajouter un exemple réel en direct, parce que vérifier le code source pour un 'NestedHyperlinkedRelatedField' vous peut voir qu'il fait un certain fractionnement de chaîne etc https://github.com/alanjds/drf-nested-routers/blob/c60e752b797d3acbec72ab1b90ab35772496cebd/rest_framework_nested/relations.py#L20. Alors quand cela arrive, il est plus facile de déboguer un exemple réel. –