From a490e99b0320707be0ccfb86c65b954bf4f437d3 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Thu, 13 Oct 2016 12:00:37 +0100 Subject: [PATCH] Minimal fix that addresses test case --- rest_framework/serializers.py | 2 +- rest_framework/utils/field_mapping.py | 2 +- rest_framework/utils/model_meta.py | 15 ++++++++++----- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 02c21da15..6b0aa32a8 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -1167,7 +1167,7 @@ class ModelSerializer(Serializer): field_kwargs = get_relation_kwargs(field_name, relation_info) to_field = field_kwargs.pop('to_field', None) - if to_field and not relation_info.related_model._meta.get_field(to_field).primary_key: + if to_field and not relation_info.reverse and not relation_info.related_model._meta.get_field(to_field).primary_key: field_kwargs['slug_field'] = to_field field_class = self.serializer_related_to_field diff --git a/rest_framework/utils/field_mapping.py b/rest_framework/utils/field_mapping.py index 64df9a08e..29005f6b7 100644 --- a/rest_framework/utils/field_mapping.py +++ b/rest_framework/utils/field_mapping.py @@ -238,7 +238,7 @@ def get_relation_kwargs(field_name, relation_info): """ Creates a default instance of a flat relational field. """ - model_field, related_model, to_many, to_field, has_through_model = relation_info + model_field, related_model, to_many, to_field, has_through_model, reverse = relation_info kwargs = { 'queryset': related_model._default_manager, 'view_name': get_detail_view_name(related_model) diff --git a/rest_framework/utils/model_meta.py b/rest_framework/utils/model_meta.py index 94aa46e72..3e3e434e6 100644 --- a/rest_framework/utils/model_meta.py +++ b/rest_framework/utils/model_meta.py @@ -23,7 +23,8 @@ RelationInfo = namedtuple('RelationInfo', [ 'related_model', 'to_many', 'to_field', - 'has_through_model' + 'has_through_model', + 'reverse' ]) @@ -81,7 +82,8 @@ def _get_forward_relationships(opts): related_model=get_related_model(field), to_many=False, to_field=_get_to_field(field), - has_through_model=False + has_through_model=False, + reverse=False ) # Deal with forward many-to-many relationships. @@ -94,7 +96,8 @@ def _get_forward_relationships(opts): to_field=None, has_through_model=( not get_remote_field(field).through._meta.auto_created - ) + ), + reverse=False ) return forward_relations @@ -118,7 +121,8 @@ def _get_reverse_relationships(opts): related_model=related, to_many=get_remote_field(relation.field).multiple, to_field=_get_to_field(relation.field), - has_through_model=False + has_through_model=False, + reverse=True ) # Deal with reverse many-to-many relationships. @@ -135,7 +139,8 @@ def _get_reverse_relationships(opts): has_through_model=( (getattr(get_remote_field(relation.field), 'through', None) is not None) and not get_remote_field(relation.field).through._meta.auto_created - ) + ), + reverse=True ) return reverse_relations