From c1823ca67e72c7517147fadf42ff7842c46a6883 Mon Sep 17 00:00:00 2001
From: Sylvain Le Bon <sylvain@happy-dev.fr>
Date: Wed, 28 Feb 2018 22:17:01 +0100
Subject: [PATCH] update: configurable fields (fix #6)

---
 serializers.py |  6 +++++-
 views.py       | 10 ++++++++--
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/serializers.py b/serializers.py
index 2080dfae..0b081728 100644
--- a/serializers.py
+++ b/serializers.py
@@ -1,3 +1,4 @@
+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
@@ -22,7 +23,10 @@ class JsonLdRelatedField(HyperlinkedRelatedField):
         except MultiValueDictKeyError:
             pass
     def to_representation(self, value):
-        return {'@id': super().to_representation(value)}
+        try:
+            return {'@id': super().to_representation(value)}
+        except ImproperlyConfigured:
+            return value.pk
 
 class LDPSerializer(HyperlinkedModelSerializer):
     url_field_name = "@id"
diff --git a/views.py b/views.py
index 8aad72cb..f769e41c 100644
--- a/views.py
+++ b/views.py
@@ -28,14 +28,20 @@ class NoCSRFAuthentication(SessionAuthentication):
 
 class LDPViewSet(ModelViewSet):
     model = None
+    fields = None
     renderer_classes = (JSONLDRenderer, )
     parser_classes = (JSONLDParser, )
     authentication_classes = (NoCSRFAuthentication,)
     
     def __init__(self, **kwargs):
         super().__init__(**kwargs)
-        class_attrs = {'Meta': type('Meta', (), {'model': self.model, 'exclude': ()})}
-        self.serializer_class = type(LDPSerializer)(self.model._meta.object_name.lower()+'Serializer', (LDPSerializer,), class_attrs)
+        meta_args =  {'model': self.model}
+        if self.fields:
+            meta_args['fields'] = self.fields
+        else:
+            meta_args['exclude'] = ()
+        meta_class = type('Meta', (), meta_args)
+        self.serializer_class = type(LDPSerializer)(self.model._meta.object_name.lower()+'Serializer', (LDPSerializer,), {'Meta': meta_class})
     
     def get_queryset(self, *args, **kwargs):
         if self.model:
-- 
GitLab