2017-09-29 2 views
2

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!

+0

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? –

+0

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

+0

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. –

Répondre

1

Je l'ai fait avant d'utiliser NestedHyperlinkedRelatedField et cela fonctionne définitivement. Ma conjecture est que votre configuration n'est pas correcte. Une chose que j'ai remarquée est que vous utilisez parent_lookup_url_kwargs alors que dans mon cas j'utilise parent_lookup_kwargs.

en fonction de votre explication, je pense qu'il doit ressembler à ceci

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