From 8f407214338f183367d19c60ea5c976332e67c9f Mon Sep 17 00:00:00 2001 From: Sylvain Le Bon <sylvain@happy-dev.fr> Date: Sun, 3 Jun 2018 20:28:16 +0200 Subject: [PATCH] bugfix: fixed error on related model when using a custom lookup field --- djangoldp/serializers.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index 8ccc6d3f..ef684a99 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -4,6 +4,7 @@ from django.utils.datastructures import MultiValueDictKeyError from rest_framework.relations import HyperlinkedRelatedField, ManyRelatedField from rest_framework.serializers import HyperlinkedModelSerializer, ListSerializer, CharField from rest_framework.utils.serializer_helpers import ReturnDict +from rest_framework.utils.field_mapping import get_nested_relation_kwargs class ContainerSerializer(ListSerializer): def to_representation(self, data): @@ -28,9 +29,19 @@ class JsonLdRelatedField(HyperlinkedRelatedField): except ImproperlyConfigured: return value.pk +class JsonLdIdentityField(JsonLdRelatedField): + def __init__(self, view_name=None, **kwargs): + kwargs['read_only'] = True + kwargs['source'] = '*' + super(JsonLdIdentityField, self).__init__(view_name, **kwargs) + + def use_pk_only_optimization(self): + return False + class LDPSerializer(HyperlinkedModelSerializer): url_field_name = "@id" serializer_related_field = JsonLdRelatedField + serializer_url_field = JsonLdIdentityField def get_default_field_names(self, declared_fields, model_info): return super().get_default_field_names(declared_fields, model_info) + list(getattr(self.Meta, 'extra_fields', [])) @@ -41,6 +52,16 @@ class LDPSerializer(HyperlinkedModelSerializer): data['@type'] = obj._meta.rdf_type 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 + depth = nested_depth - 1 + fields = '__all__' + + return NestedSerializer, get_nested_relation_kwargs(relation_info) + @classmethod def many_init(cls, *args, **kwargs): kwargs['child'] = cls() -- GitLab