use numeric primary keys, but still use unique names as lookups in the API

This commit is contained in:
Laura Klünder 2016-10-11 16:33:12 +02:00
parent fcd0f8072b
commit 9658de72a2
14 changed files with 46 additions and 95 deletions

View file

@ -4,13 +4,13 @@ from django.db.models.manager import BaseManager
from rest_framework import serializers
class PkField(serializers.DictField):
class RelatedNameField(serializers.DictField):
"""
give primary key
"""
def to_representation(self, obj):
if hasattr(obj, 'pk'):
return obj.pk
if hasattr(obj, 'name'):
return obj.name
elif isinstance(obj, Iterable):
return tuple(self.to_representation(elem) for elem in obj)
elif isinstance(obj, BaseManager):
@ -30,7 +30,7 @@ class RecursiveSerializerMixin(serializers.Serializer):
for name in getattr(self.Meta, 'sparse_exclude', ()):
value = self.fields.get(name)
if value is not None and isinstance(value, serializers.Serializer):
self.fields[name] = PkField()
self.fields[name] = RelatedNameField()
if request_sparse:
for name in tuple(self.fields):
@ -42,5 +42,5 @@ class RecursiveSerializerMixin(serializers.Serializer):
def recursive_value(self, serializer, obj, *args, **kwargs):
if self.context.get('sparse'):
return PkField().to_representation(obj)
return RelatedNameField().to_representation(obj)
return serializer(obj, context=self.sparse_context(), *args, **kwargs).data