From 389f7f4dbc08ab0ec0ba339084083757572fd37d Mon Sep 17 00:00:00 2001 From: HiddenWarrior Date: Sun, 21 Oct 2018 14:02:03 +0200 Subject: [PATCH] adding_appendlist_field:adding append list field --- rest_framework/fields.py | 12 ++++++++++++ tests/test_fields.py | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index fd0e8af13..ece2eac18 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1949,3 +1949,15 @@ class TransformitiveFieldMixin(): :return: """ raise NotImplementedError("apply_tranformation is not implement for this field %s" % self.field_name) + + +class AppendListField(ListField, TransformitiveFieldMixin): + """ + it's field works with modelserializer that appends the old list value and the new list value + """ + + def apply_transformation(self, instance, data): + old_value = self.get_attribute(instance) or [] + new_value = self.get_value(data) or [] + if new_value != empty: + data[self.field_name] = old_value + new_value diff --git a/tests/test_fields.py b/tests/test_fields.py index 9a1d04979..8a3ba5d17 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -8,6 +8,7 @@ from decimal import ROUND_DOWN, ROUND_UP, Decimal import pytest import pytz from django.core.exceptions import ValidationError as DjangoValidationError +from django.db import models from django.http import QueryDict from django.test import TestCase, override_settings from django.utils import six @@ -2288,3 +2289,42 @@ class TestValidationErrorCode: ), ] } +class ListFieldModel(models.Model): + list_field = models.ListField(child=models.CharField) + + + +class TestAppendListField(TestCase): + class TestSerializer(serializers.ModelSerializer): + list_field = serializers.AppendListField(child=serializers.CharField) + + class Meta: + model = ListFieldModel + fields = ('list_field') + + + def setUp(self): + self.instance = ListFieldModel(list_field=["abc"]) + + class TestSerializer(serializers.ModelSerializer): + list_field = serializers.AppendListField(child=serializers.CharField) + + class Meta: + model = ListFieldModel + fields = ('list_field') + self.serializer = TestSerializer + + def test_adding_data_without_instance(self): + serializer = self.serializer(data={"list_field":["bb"]}) + new_instance = serializer.save() + self.asserEqual(new_instance.list_field,["bb"]) + + def test_adding_data_without_instance(self): + serializer = self.serializer(instance=self.instance,data={}) + new_instance = serializer.save() + self.asserEqual(new_instance.list_field,["abc"]) + + def test_adding_data_and_instance(self): + serializer = self.serializer(instance=self.instance,data={"list_field":["bb"]}) + new_instance = serializer.save() + self.asserEqual(new_instance.list_field,["abc","bb"]) \ No newline at end of file