Commit 6d89430d by Tom Christie

Merge pull request #2475 from sdreher/master

 ManyRelatedField.get_value clearing field on partial update
parents 81c2562e e7da266a
...@@ -338,7 +338,12 @@ class ManyRelatedField(Field): ...@@ -338,7 +338,12 @@ class ManyRelatedField(Field):
# We override the default field access in order to support # We override the default field access in order to support
# lists in HTML forms. # lists in HTML forms.
if html.is_html_input(dictionary): if html.is_html_input(dictionary):
# Don't return [] if the update is partial
if self.field_name not in dictionary:
if getattr(self.root, 'partial', False):
return empty
return dictionary.getlist(self.field_name) return dictionary.getlist(self.field_name)
return dictionary.get(self.field_name, empty) return dictionary.get(self.field_name, empty)
def to_internal_value(self, data): def to_internal_value(self, data):
......
from .utils import mock_reverse, fail_reverse, BadType, MockObject, MockQueryset from .utils import mock_reverse, fail_reverse, BadType, MockObject, MockQueryset
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.utils.datastructures import MultiValueDict
from rest_framework import serializers from rest_framework import serializers
from rest_framework.fields import empty
from rest_framework.test import APISimpleTestCase from rest_framework.test import APISimpleTestCase
import pytest import pytest
...@@ -134,3 +136,34 @@ class TestSlugRelatedField(APISimpleTestCase): ...@@ -134,3 +136,34 @@ class TestSlugRelatedField(APISimpleTestCase):
def test_representation(self): def test_representation(self):
representation = self.field.to_representation(self.instance) representation = self.field.to_representation(self.instance)
assert representation == self.instance.name assert representation == self.instance.name
class TestManyRelatedField(APISimpleTestCase):
def setUp(self):
self.instance = MockObject(pk=1, name='foo')
self.field = serializers.StringRelatedField(many=True)
self.field.field_name = 'foo'
def test_get_value_regular_dictionary_full(self):
assert 'bar' == self.field.get_value({'foo': 'bar'})
assert empty == self.field.get_value({'baz': 'bar'})
def test_get_value_regular_dictionary_partial(self):
setattr(self.field.root, 'partial', True)
assert 'bar' == self.field.get_value({'foo': 'bar'})
assert empty == self.field.get_value({'baz': 'bar'})
def test_get_value_multi_dictionary_full(self):
mvd = MultiValueDict({'foo': ['bar1', 'bar2']})
assert ['bar1', 'bar2'] == self.field.get_value(mvd)
mvd = MultiValueDict({'baz': ['bar1', 'bar2']})
assert [] == self.field.get_value(mvd)
def test_get_value_multi_dictionary_partial(self):
setattr(self.field.root, 'partial', True)
mvd = MultiValueDict({'foo': ['bar1', 'bar2']})
assert ['bar1', 'bar2'] == self.field.get_value(mvd)
mvd = MultiValueDict({'baz': ['bar1', 'bar2']})
assert empty == self.field.get_value(mvd)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment