diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index 406a6f2160fa581aa574f69a16c5645fa923c1aa..a3dbe8b061caab1615c01556e31872f3a9b4321c 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -22,6 +22,8 @@ from djangoldp.models import Model class LDListMixin: + child_attr = 'child' + def to_internal_value(self, data): try: data = data['ldp:contains'] @@ -31,7 +33,8 @@ class LDListMixin: data = [data] if isinstance(data, str) and data.startswith("http"): data = [{'@id': data}] - return [self.child.to_internal_value(item) for item in data] + + return [getattr(self, self.child_attr).to_internal_value(item) for item in data] def to_representation(self, value): return {'@id': self.id, @@ -120,7 +123,9 @@ class ContainerSerializer(LDListMixin, ListSerializer): class ManyJsonLdRelatedField(LDListMixin, ManyRelatedField): - pass + child_attr = 'child_relation' + url_field_name = "@id" + class JsonLdField(HyperlinkedRelatedField): @@ -449,8 +454,11 @@ class LDPSerializer(HyperlinkedModelSerializer): for (field_name, data) in nested_fields: manager = getattr(instance, field_name) slug_field = Model.slug_field(instance) + try: + item_pk_to_keep = list(map(lambda e: e[slug_field], filter(lambda x: slug_field in x, data))) + except TypeError: + item_pk_to_keep = list(map(lambda e: getattr(e, slug_field), filter(lambda x: hasattr(x, slug_field), data))) - item_pk_to_keep = list(map(lambda e: e[slug_field], filter(lambda x: slug_field in x, data))) for item in list(manager.all()): if not str(getattr(item, slug_field)) in item_pk_to_keep: if getattr(manager, 'through', None) is None: @@ -459,10 +467,13 @@ class LDPSerializer(HyperlinkedModelSerializer): manager.remove(item) for item in data: - if slug_field in item: + if not isinstance(item, dict): + item.save() + saved_item = item + elif slug_field in item: kwargs = {slug_field: item[slug_field]} - oldObj = manager.model.objects.get(**kwargs) - savedItem = self.update(instance=oldObj, validated_data=item) + old_obj = manager.model.objects.get(**kwargs) + saved_item = self.update(instance=old_obj, validated_data=item) else: rel = getattr(instance._meta.model, field_name).rel try: @@ -471,7 +482,7 @@ class LDPSerializer(HyperlinkedModelSerializer): item[reverse_id] = instance.pk except AttributeError: pass - savedItem = self.internal_create(validated_data=item, model=manager.model) + saved_item = self.internal_create(validated_data=item, model=manager.model) if getattr(manager, 'through', None) is not None and manager.through._meta.auto_created: - manager.add(savedItem) + manager.add(saved_item)