adding_appendlist_field:adding append list field

This commit is contained in:
HiddenWarrior 2018-10-21 14:02:03 +02:00
parent 61379205d4
commit 389f7f4dbc
2 changed files with 52 additions and 0 deletions

View File

@ -1949,3 +1949,15 @@ class TransformitiveFieldMixin():
:return: :return:
""" """
raise NotImplementedError("apply_tranformation is not implement for this field %s" % self.field_name) 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

View File

@ -8,6 +8,7 @@ from decimal import ROUND_DOWN, ROUND_UP, Decimal
import pytest import pytest
import pytz import pytz
from django.core.exceptions import ValidationError as DjangoValidationError from django.core.exceptions import ValidationError as DjangoValidationError
from django.db import models
from django.http import QueryDict from django.http import QueryDict
from django.test import TestCase, override_settings from django.test import TestCase, override_settings
from django.utils import six 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"])