mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-08 14:24:48 +03:00
Merge 5dd336ec6c
into 0f61c9ec29
This commit is contained in:
commit
89bc6d53aa
|
@ -532,7 +532,7 @@ This option should be a list or tuple of field names, and is declared as follows
|
||||||
fields = ('id', 'account_name', 'users', 'created')
|
fields = ('id', 'account_name', 'users', 'created')
|
||||||
read_only_fields = ('account_name',)
|
read_only_fields = ('account_name',)
|
||||||
|
|
||||||
Model fields which have `editable=False` set, and `AutoField` fields will be set to read-only by default, and do not need to be added to the `read_only_fields` option.
|
Model fields which have `editable=False` set, and `AutoField` fields will be set to read-only by default, and do not need to be added to the `read_only_fields` option. Having a field listed in `read_only_fields` and declared on the class will raise an exception.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -570,6 +570,8 @@ This option is a dictionary, mapping field names to a dictionary of keyword argu
|
||||||
user.save()
|
user.save()
|
||||||
return user
|
return user
|
||||||
|
|
||||||
|
Having arguments for a field in `extra_kwargs` for a field declared on the class will raise an exception.
|
||||||
|
|
||||||
## Relational fields
|
## Relational fields
|
||||||
|
|
||||||
When serializing model instances, there are a number of different ways you might choose to represent relationships. The default representation for `ModelSerializer` is to use the primary keys of the related instances.
|
When serializing model instances, there are a number of different ways you might choose to represent relationships. The default representation for `ModelSerializer` is to use the primary keys of the related instances.
|
||||||
|
|
|
@ -947,6 +947,11 @@ class ModelSerializer(Serializer):
|
||||||
# Determine any extra field arguments and hidden fields that
|
# Determine any extra field arguments and hidden fields that
|
||||||
# should be included
|
# should be included
|
||||||
extra_kwargs = self.get_extra_kwargs()
|
extra_kwargs = self.get_extra_kwargs()
|
||||||
|
for field in extra_kwargs:
|
||||||
|
assert field not in declared_fields, (
|
||||||
|
"Field {} is declared on the class and also present in "
|
||||||
|
"extra_kwargs or read_only_fields".format(field)
|
||||||
|
)
|
||||||
extra_kwargs, hidden_fields = self.get_uniqueness_extra_kwargs(
|
extra_kwargs, hidden_fields = self.get_uniqueness_extra_kwargs(
|
||||||
field_names, declared_fields, extra_kwargs
|
field_names, declared_fields, extra_kwargs
|
||||||
)
|
)
|
||||||
|
@ -1321,12 +1326,11 @@ class ModelSerializer(Serializer):
|
||||||
# add in a hidden field that populates it.
|
# add in a hidden field that populates it.
|
||||||
hidden_fields[unique_constraint_name] = HiddenField(default=default)
|
hidden_fields[unique_constraint_name] = HiddenField(default=default)
|
||||||
|
|
||||||
# Update `extra_kwargs` with any new options.
|
# Update `extra_kwargs` with any new options but don't overwrite old values.
|
||||||
for key, value in uniqueness_extra_kwargs.items():
|
for key, value in uniqueness_extra_kwargs.items():
|
||||||
if key in extra_kwargs:
|
if key in extra_kwargs:
|
||||||
extra_kwargs[key].update(value)
|
value.update(extra_kwargs[key])
|
||||||
else:
|
extra_kwargs[key] = value
|
||||||
extra_kwargs[key] = value
|
|
||||||
|
|
||||||
return extra_kwargs, hidden_fields
|
return extra_kwargs, hidden_fields
|
||||||
|
|
||||||
|
|
|
@ -933,8 +933,8 @@ class TestMetaInheritance(TestCase):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = OneFieldModel
|
model = OneFieldModel
|
||||||
read_only_fields = ('char_field', 'non_model_field')
|
read_only_fields = ('char_field',)
|
||||||
fields = read_only_fields
|
fields = read_only_fields + ('non_model_field', )
|
||||||
extra_kwargs = {}
|
extra_kwargs = {}
|
||||||
|
|
||||||
class ChildSerializer(TestSerializer):
|
class ChildSerializer(TestSerializer):
|
||||||
|
@ -955,3 +955,44 @@ class TestMetaInheritance(TestCase):
|
||||||
self.assertEqual(unicode_repr(ChildSerializer()), child_expected)
|
self.assertEqual(unicode_repr(ChildSerializer()), child_expected)
|
||||||
self.assertEqual(unicode_repr(TestSerializer()), test_expected)
|
self.assertEqual(unicode_repr(TestSerializer()), test_expected)
|
||||||
self.assertEqual(unicode_repr(ChildSerializer()), child_expected)
|
self.assertEqual(unicode_repr(ChildSerializer()), child_expected)
|
||||||
|
|
||||||
|
|
||||||
|
class TestDeclaredFieldsConflict(TestCase):
|
||||||
|
def test_extra_kwargs_conflict(self):
|
||||||
|
class TestSerializer(serializers.ModelSerializer):
|
||||||
|
some_field = serializers.CharField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = OneFieldModel
|
||||||
|
extra_kwargs = {'some_field': {'read_only': True}}
|
||||||
|
with self.assertRaises(AssertionError):
|
||||||
|
TestSerializer().get_fields()
|
||||||
|
|
||||||
|
def test_read_only_fields_conflict(self):
|
||||||
|
class TestSerializer(serializers.ModelSerializer):
|
||||||
|
some_field = serializers.CharField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = OneFieldModel
|
||||||
|
read_only_fields = ('some_field', )
|
||||||
|
with self.assertRaises(AssertionError):
|
||||||
|
TestSerializer().get_fields()
|
||||||
|
|
||||||
|
|
||||||
|
class TestUniquenessOverride(TestCase):
|
||||||
|
def test_required_not_overwritten(self):
|
||||||
|
class TestModel(models.Model):
|
||||||
|
field_1 = models.IntegerField(null=True)
|
||||||
|
field_2 = models.IntegerField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
unique_together = (('field_1', 'field_2'),)
|
||||||
|
|
||||||
|
class TestSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = TestModel
|
||||||
|
extra_kwargs = {'field_1': {'required': False}}
|
||||||
|
|
||||||
|
fields = TestSerializer().fields
|
||||||
|
self.assertFalse(fields['field_1'].required)
|
||||||
|
self.assertTrue(fields['field_2'].required)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user