diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index 291ae714efebd01e0d26976d693e9de7dea2b282..0539e862543ccfe587c04e814831eb12b605015d 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -364,7 +364,7 @@ class LDPSerializer(HyperlinkedModelSerializer): object_list)) else: container_id = Model.container_id(self.parent.instance) - obj = next(filter(lambda o: container_id in o[self.url_field_name], object_list)) + obj = next(filter(lambda o: container_id.lstrip('/') in o[self.url_field_name], object_list)) item = super().get_value(obj) full_item = None if item is empty: @@ -432,16 +432,23 @@ class LDPSerializer(HyperlinkedModelSerializer): for field_name in nested_fields_name: nested_fields.append((field_name, validated_data.pop(field_name))) + info = model_meta.get_field_info(instance) for attr, value in validated_data.items(): if isinstance(value, dict): slug_field = Model.slug_field(instance) - manager = getattr(instance, attr) + relation_info = info.relations.get(attr) if slug_field in value: kwargs = {slug_field: value[slug_field]} - oldObj = manager._meta.model.objects.get(**kwargs) + if relation_info.to_many: + manager = getattr(instance, attr) + oldObj = manager._meta.model.objects.get(**kwargs) + else: + oldObj = getattr(instance, attr) value = self.update(instance=oldObj, validated_data=value) else: - value = self.internal_create(validated_data=value, model=manager._meta.model) + if not relation_info.to_many: + value[instance._meta.fields_map[attr].remote_field.name] = instance + value = self.internal_create(validated_data=value, model=relation_info.related_model) setattr(instance, attr, value) instance.save() diff --git a/djangoldp/tests/models.py b/djangoldp/tests/models.py index 468377c8d7f2c07cce69f468c039967b423e14b4..95dcd8fdd1971f9d8b7c0227d58dd50ff22ac673 100644 --- a/djangoldp/tests/models.py +++ b/djangoldp/tests/models.py @@ -32,6 +32,11 @@ class Conversation(models.Model): author_user = models.ForeignKey(settings.AUTH_USER_MODEL) +class UserProfile(Model): + description = models.CharField(max_length=255, blank=True, null=True) + user = models.OneToOneField(settings.AUTH_USER_MODEL) + + class Message(models.Model): text = models.CharField(max_length=255, blank=True, null=True) conversation = models.ForeignKey(Conversation, on_delete=models.DO_NOTHING) @@ -81,4 +86,4 @@ class Post(Model): auto_author = 'author' -get_user_model()._meta.serializer_fields = ['@id', 'username', 'first_name', 'last_name', 'email', 'conversation_set'] +get_user_model()._meta.serializer_fields = ['@id', 'username', 'first_name', 'last_name', 'email', 'userprofile'] diff --git a/djangoldp/tests/tests_update.py b/djangoldp/tests/tests_update.py index 41f10a9089c5b2f3f92d0578f3b785d12873194a..1e3f22d2a92a24e481d593ba46159e209f980608 100644 --- a/djangoldp/tests/tests_update.py +++ b/djangoldp/tests/tests_update.py @@ -284,10 +284,10 @@ class Update(TestCase): "http://happy-dev.fr/owl/#first_name": "Alexandre", "http://happy-dev.fr/owl/#last_name": "Bourlier", "http://happy-dev.fr/owl/#username": "alex", - 'http://happy-dev.fr/owl/#conversation_set': {'@id': "_:b975"} + 'http://happy-dev.fr/owl/#userprofile': {'@id': "_:b975"} } ] response = self.client.put('/users/{}/'.format(user.pk), data=json.dumps(body), content_type='application/ld+json') self.assertEqual(response.status_code, 200) - self.assertIn('conversation_set', response.data) + self.assertIn('userprofile', response.data)