diff --git a/serializers.py b/serializers.py index de3f357cfa071c156908ce30d95df154d73360f6..ef08ff7005b43e79cb40bd8c0a580addbc0c94a4 100644 --- a/serializers.py +++ b/serializers.py @@ -1,3 +1,5 @@ +from django.core.urlresolvers import get_resolver +from rest_framework.relations import HyperlinkedRelatedField from rest_framework.serializers import HyperlinkedModelSerializer, ListSerializer, CharField from rest_framework.utils.serializer_helpers import ReturnDict @@ -11,6 +13,14 @@ class ContainerSerializer(ListSerializer): class LDPSerializer(HyperlinkedModelSerializer): url_field_name = "@id" + def __init__(self, *args, **kwargs): + super(LDPSerializer, self).__init__(*args, **kwargs) + for name, field in self.fields.items(): + if isinstance(field, HyperlinkedRelatedField): + lookup_field = get_resolver().reverse_dict[field.view_name][0][0][1][0] + field.lookup_field = lookup_field + field.lookup_url_kwarg = lookup_field + @classmethod def many_init(cls, *args, **kwargs): kwargs['child'] = cls() diff --git a/views.py b/views.py index 711f6db6a19bf311484a33f94c31a5a85da21979..939af65e40f41ec7dc9f25b12a4c48fa1b1ad1ce 100644 --- a/views.py +++ b/views.py @@ -1,4 +1,5 @@ from pyld import jsonld +from django.apps import apps from django.conf import settings from django.conf.urls import url from django.utils.decorators import classonlymethod @@ -27,7 +28,7 @@ class LDPViewSet(ModelViewSet): def __init__(self, model, **kwargs): class_attrs = {'Meta': type('Meta', (), {'model': model, 'exclude': ()})} - self.serializer_class = type(LDPSerializer)(model.__name__+'Serializer', (LDPSerializer,), class_attrs) + self.serializer_class = type(LDPSerializer)(model._meta.object_name.lower()+'Serializer', (LDPSerializer,), class_attrs) super().__init__(model=model, **kwargs) def get_queryset(self, *args, **kwargs): @@ -39,12 +40,14 @@ class LDPViewSet(ModelViewSet): @classonlymethod def urls(cls, **kwargs): if isinstance(kwargs['model'], str): - model = kwargs['model'].split('.')[-1].lower() - else: - model = kwargs['model']._meta.object_name.lower() + kwargs['model'] = apps.get_model(kwargs['model']) + model = kwargs['model']._meta.object_name.lower() + detail_url = r'^(?P<pk>\d+)$' + if kwargs.get('lookup_field'): + detail_url = r'^(?P<{}>[\w-]+)$'.format(kwargs['lookup_field']) return [ url(r'^$', cls.as_view({'get': 'list', 'post': 'create'}, **kwargs), name='{}-list'.format(model)), - url(r'^(?P<pk>\d+)$', cls.as_view({'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'}, **kwargs), name='{}-detail'.format(model)), + url(detail_url, cls.as_view({'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'}, **kwargs), name='{}-detail'.format(model)), ] def dispatch(self, request, *args, **kwargs):