diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 3d134a741..9fd1a4c95 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -126,11 +126,16 @@ class BaseSerializer(Field): for key, val in fields.items(): if key not in ret: ret[key] = val + if value.source.primary_key: + pk_field = key # If 'fields' is specified, use those fields, in that order. if self.opts.fields: new = SortedDict() for key in self.opts.fields: + if key == 'pk': + # User requested the 'pk', use the primary key found + new[key] = ret[pk_field] new[key] = ret[key] ret = new @@ -344,12 +349,11 @@ class ModelSerializer(Serializer): fields += [field for field in opts.many_to_many if field.serialize] ret = SortedDict() - is_pk = True # First field in the list is the pk for model_field in fields: - if is_pk: + if model_field.primary_key: + # Django requires models to have only one primary_key so this should be safe field = self.get_pk_field(model_field) - is_pk = False elif model_field.rel and nested: field = self.get_nested_field(model_field) elif model_field.rel: