From 83d458b9a4eaeb6049b383134c6af4b20d9b216f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Ekl=C3=B6f?= Date: Thu, 15 Apr 2021 13:19:53 +0200 Subject: [PATCH 1/2] add support for initializing serializer with arg many=True --- drf_writable_nested/mixins.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/drf_writable_nested/mixins.py b/drf_writable_nested/mixins.py index c8d4113..60d7afb 100644 --- a/drf_writable_nested/mixins.py +++ b/drf_writable_nested/mixins.py @@ -13,7 +13,36 @@ from rest_framework.validators import UniqueValidator +class BaseNestedListSerializer(serializers.ListSerializer): + def create(self, validated_data): + instances = [] + for attrs in self.get_initial(): + self.child.initial_data = attrs + instances.append( + self.child.create( + validated_data=self.child.to_internal_value(attrs) + ) + ) + return instances + + def update(self, instance, validated_data): + raise NotImplementedError( + "Update not supported with many=True, only create." + ) + + def save(self, **kwargs): + self.child._save_kwargs = defaultdict(dict, kwargs) + + super(BaseNestedListSerializer, self).save(**kwargs) + class BaseNestedModelSerializer(serializers.ModelSerializer): + @classmethod + def many_init(cls, *args, **kwargs): + # Allow overriding of list_serializer_class, else use BaseNestedListSerializer + if not getattr(cls.Meta, 'list_serializer_class', None): + cls.Meta.list_serializer_class = BaseNestedListSerializer + return super(BaseNestedModelSerializer, cls).many_init(*args, **kwargs) + def _extract_relations(self, validated_data): reverse_relations = OrderedDict() relations = OrderedDict() From 9096e782748d7031756029efd3ba8d9f7e3953b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Ekl=C3=B6f?= Date: Thu, 15 Apr 2021 13:21:38 +0200 Subject: [PATCH 2/2] Change phrasing on many_init comment --- drf_writable_nested/mixins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drf_writable_nested/mixins.py b/drf_writable_nested/mixins.py index 60d7afb..2fc5fe6 100644 --- a/drf_writable_nested/mixins.py +++ b/drf_writable_nested/mixins.py @@ -38,7 +38,7 @@ def save(self, **kwargs): class BaseNestedModelSerializer(serializers.ModelSerializer): @classmethod def many_init(cls, *args, **kwargs): - # Allow overriding of list_serializer_class, else use BaseNestedListSerializer + # Allow overriding of list_serializer_class, default to BaseNestedListSerializer if not getattr(cls.Meta, 'list_serializer_class', None): cls.Meta.list_serializer_class = BaseNestedListSerializer return super(BaseNestedModelSerializer, cls).many_init(*args, **kwargs)