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:
"""
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 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"])