diff --git a/README.md b/README.md index 63ca145a..798f6db3 100644 --- a/README.md +++ b/README.md @@ -241,6 +241,53 @@ class MailRecipientViewSet(viewsets.ViewSet): return Response(serializer.data) ``` +### OneToOne Relation Nesting + +Example of implementing order to client OneToOne relation. + +``` +/clients/ +/clients/{pk}/ +/clients/{client_pk}/order/ +/clients/{client_pk}/order/plans/ +/clients/{client_pk}/order/plans/{pk}/ +``` + +```python +# seriliazers.py + +class ClientsSerializer(HyperlinkedModelSerializer): + class Meta: + model = Classes + fields = ('order_url', ...) + + +class OrderSerializer(NestedHyperlinkedModelSerializer): + class Meta: + model = Orders + fields = ('url', 'plans_url', ...) + + parent_lookup_kwargs = { 'client_pk': 'client__pk' } + + url = NestedHyperlinkedIdentityField( + view_name='client-order-detail', + lookup_field=None, + parent_lookup_kwargs=parent_lookup_kwargs + ) + + plans_url = NestedHyperlinkedIdentityField( + view_name='client-order-plans-list', + lookup_field=None, + parent_lookup_kwargs=parent_lookup_kwargs + ) + + +class PlansSerializer(NestedHyperlinkedModelSerializer): + class Meta: + model = Plans + fields = (...) +``` + ## Testing In order to get started with testing, you will need to install [tox](https://tox.readthedocs.io/en/latest/). diff --git a/rest_framework_nested/relations.py b/rest_framework_nested/relations.py index 9882c919..1e35611c 100644 --- a/rest_framework_nested/relations.py +++ b/rest_framework_nested/relations.py @@ -37,10 +37,13 @@ def get_url(self, obj, view_name, request, format): # Unsaved objects will not yet have a valid URL. if hasattr(obj, 'pk') and obj.pk in (None, ''): return None - - # default lookup from rest_framework.relations.HyperlinkedRelatedField - lookup_value = getattr(obj, self.lookup_field) - kwargs = {self.lookup_url_kwarg: lookup_value} + + if self.lookup_field: + # default lookup from rest_framework.relations.HyperlinkedRelatedField + lookup_value = getattr(obj, self.lookup_field) + kwargs = {self.lookup_url_kwarg: lookup_value} + else: + kwargs = {} # multi-level lookup for parent_lookup_kwarg in list(self.parent_lookup_kwargs.keys()):