diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index 6fbf308270ab301634cb26a77054d6b1c6927c4b..eed039260aea9bf8f28825fe48e11eaf0a3c2bce 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -1,8 +1,9 @@ +import json from django.core.exceptions import ImproperlyConfigured from django.core.urlresolvers import get_resolver from django.utils.datastructures import MultiValueDictKeyError -from rest_framework.relations import HyperlinkedRelatedField, ManyRelatedField -from rest_framework.serializers import HyperlinkedModelSerializer, ListSerializer, CharField +from rest_framework.relations import HyperlinkedRelatedField, ManyRelatedField, MANY_RELATION_KWARGS +from rest_framework.serializers import HyperlinkedModelSerializer, ListSerializer from rest_framework.utils.serializer_helpers import ReturnDict from rest_framework.utils.field_mapping import get_nested_relation_kwargs @@ -17,7 +18,7 @@ class JsonLdField(HyperlinkedRelatedField): def __init__(self, view_name=None, **kwargs): super().__init__(view_name, **kwargs) self.get_lookup_args() - + def get_lookup_args(self): try: lookup_field = get_resolver().reverse_dict[self.view_name][0][0][1][0] @@ -26,19 +27,40 @@ class JsonLdField(HyperlinkedRelatedField): except MultiValueDictKeyError: pass +class ManyJsonLdRelatedField(ManyRelatedField): + def to_internal_value(self, data): + data = json.loads(data) + if isinstance(data, dict): + data = [data] + return [self.child_relation.to_internal_value(item['@id']) for item in data] + class JsonLdRelatedField(JsonLdField): def to_representation(self, value): try: return {'@id': super().to_representation(value)} except ImproperlyConfigured: return value.pk + + def to_internal_value(self, data): + try: + return super().to_internal_value(json.loads(data)['@id']) + except: + return super().to_internal_value(data) + + @classmethod + def many_init(cls, *args, **kwargs): + list_kwargs = {'child_relation': cls(*args, **kwargs)} + for key in kwargs: + if key in MANY_RELATION_KWARGS: + list_kwargs[key] = kwargs[key] + return ManyJsonLdRelatedField(**list_kwargs) class JsonLdIdentityField(JsonLdField): def __init__(self, view_name=None, **kwargs): kwargs['read_only'] = True kwargs['source'] = '*' super().__init__(view_name, **kwargs) - + def use_pk_only_optimization(self): return False @@ -57,7 +79,6 @@ class LDPSerializer(HyperlinkedModelSerializer): return data def build_nested_field(self, field_name, relation_info, nested_depth): - print(nested_depth) class NestedSerializer(self.__class__): class Meta: model = relation_info.related_model