diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index e0a62879307d8edda321cb18b61cf5af07fb5764..62d12c4b5c2a627943181dc4ccfe39ef2428ab90 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -3,12 +3,13 @@ from collections import OrderedDict, Mapping, Iterable from typing import Any from urllib import parse +from django.db import transaction from django.conf import settings from django.contrib.auth import get_user_model from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ValidationError as DjangoValidationError from django.urls import resolve, Resolver404, get_script_prefix -from django.urls import get_resolver +from django.urls.resolvers import get_resolver from django.db.models import QuerySet from django.utils.datastructures import MultiValueDictKeyError from django.utils.encoding import uri_to_iri @@ -629,7 +630,13 @@ class LDPSerializer(HyperlinkedModelSerializer): nested_fk_fields_name = list(filter(lambda key: isinstance(validated_data[key], dict), validated_data)) for field_name in nested_fk_fields_name: field_dict = validated_data[field_name] - field_model = model._meta.get_field(field_name).related_model + try: + field_model = model._meta.get_field(field_name).related_model + print('field_model is ' + str(field_model)) + except: + # not fk + print('except! not FK!') + continue slug_field = Model.slug_field(field_model) sub_inst = None @@ -650,11 +657,12 @@ class LDPSerializer(HyperlinkedModelSerializer): kwargs = {slug_field: field_dict[slug_field]} sub_inst = field_model.objects.get(**kwargs) if sub_inst is None: - if create: - sub_inst = self.internal_create(field_dict, field_model) - else: - continue - + with transaction.atomic(): + try: + sub_inst = self.internal_create(field_dict, field_model) + except: + print('whoops') + validated_data[field_name] = field_dict validated_data[field_name] = sub_inst return validated_data diff --git a/djangoldp/views.py b/djangoldp/views.py index a9c87bd0b8fb28c229334883148434087a143414..98aa3f93e72434b8a83e895051c3a23c5eb2af52 100644 --- a/djangoldp/views.py +++ b/djangoldp/views.py @@ -1,10 +1,11 @@ import json from django.apps import apps from django.conf import settings -from django.conf.urls import re_path, include + +from django.conf.urls import include, re_path from django.contrib.auth import get_user_model from django.core.exceptions import FieldDoesNotExist, ObjectDoesNotExist -from django.urls import get_resolver +from django.urls.resolvers import get_resolver from django.db import IntegrityError, transaction from django.http import JsonResponse, Http404 from django.shortcuts import get_object_or_404 @@ -333,18 +334,7 @@ class LDPViewSetGenerator(ModelViewSet): # append nested fields to the urls list for field in kwargs.get('nested_fields') or cls.nested_fields: - # the nested property may have a custom viewset defined - try: - nested_model = kwargs['model']._meta.get_field(field).related_model - except FieldDoesNotExist: - nested_model = getattr(kwargs['model'], field).field.model - - if hasattr(nested_model, 'get_view_set'): - kwargs['view_set'] = nested_model.get_view_set() - urls_fct = kwargs['view_set'].nested_urls # our custom view_set may override nested_urls - else: - urls_fct = cls.nested_urls - urls.append(re_path('^' + detail_expr + field + '/', urls_fct(field, **kwargs))) + urls.append(re_path('^' + detail_expr + field + '/', cls.nested_urls(field, **kwargs))) return include(urls)