diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index 0f6d711a2d7b314a5104aa50b7a46fb6c7a5828b..02b96e28e0a74bdf14a294a237adc90b096cc209 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -14,7 +14,7 @@ class LDListMixin: # data = json.loads(data) try: data = data['ldp:contains'] - except TypeError: + except (TypeError, KeyError): pass if isinstance(data, dict): data = [data] @@ -187,9 +187,12 @@ class LDPSerializer(HyperlinkedModelSerializer): def to_internal_value(self, data): model = self.Meta.model - return self.serializer_related_field( + instance = self.serializer_related_field( view_name='{}-detail'.format(model._meta.object_name.lower()), queryset=model.objects.all()).to_internal_value(data) + for key in data: + setattr(instance, key, data[key]) + return instance def get_value(self, dictionary): return super().get_value(dictionary) @@ -221,6 +224,7 @@ class LDPSerializer(HyperlinkedModelSerializer): for (field_name, data) in nested_fields: for item in data: + item.save() getattr(obj, field_name).add(item) return obj @@ -236,7 +240,12 @@ class LDPSerializer(HyperlinkedModelSerializer): instance.save() for (field_name, data) in nested_fields: + try: + getattr(instance, field_name).clear() + except AttributeError: + pass for item in data: + item.save() getattr(instance, field_name).add(item) return instance diff --git a/djangoldp/tests/tests_save.py b/djangoldp/tests/tests_save.py index 53f48e2118d884cd9f6471a641efa2773558e035..4375f9430c5bc7974f1ad784a1269327f1a06932 100644 --- a/djangoldp/tests/tests_save.py +++ b/djangoldp/tests/tests_save.py @@ -9,11 +9,12 @@ class Serializer(TestCase): def test_save_m2m(self): skill1 = Skill.objects.create(title="skill1") skill2 = Skill.objects.create(title="skill2") + job = {"title": "job test", "skills": { "ldp:contains": [ {"@id": "https://happy-dev.fr/skills/{}/".format(skill1.pk)}, - {"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk)}, + {"@id": "https://happy-dev.fr/skills/{}/".format(skill2.pk), "title": "skill2 UP"}, ]} } @@ -27,6 +28,8 @@ class Serializer(TestCase): self.assertEquals(result.title, "job test") self.assertIs(result.skills.count(), 2) + self.assertEquals(result.skills.all()[0].title, "skill1") # no change + self.assertEquals(result.skills.all()[1].title, "skill2 UP") # title updated def test_save_without_nested_fields(self): skill1 = Skill.objects.create(title="skill1") diff --git a/djangoldp/tests/tests_update.py b/djangoldp/tests/tests_update.py index df79b949b5a8664efe58f0d1e30fb87108ffafe1..1b84325cd6ec1c1184d7b6d74b0581c20d90a988 100644 --- a/djangoldp/tests/tests_update.py +++ b/djangoldp/tests/tests_update.py @@ -7,9 +7,11 @@ from djangoldp.tests.models import Skill, JobOffer class Serializer(TestCase): def test_update(self): + skill = Skill.objects.create(title="to drop") skill1 = Skill.objects.create(title="skill1") skill2 = Skill.objects.create(title="skill2") job1 = JobOffer.objects.create(title="job test") + job1.skills.add(skill) job = {"@id": "https://happy-dev.fr/job-offers/{}/".format(job1.pk), "title": "job test updated",