mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-29 17:39:48 +03:00
Minor fixes
* no need to change `raise_errors_on_nested_writes` signature * declare nested-model outside of the test class
This commit is contained in:
parent
2d52a0f180
commit
3801ef7c6b
|
@ -773,7 +773,7 @@ class ListSerializer(BaseSerializer):
|
||||||
# ModelSerializer & HyperlinkedModelSerializer
|
# ModelSerializer & HyperlinkedModelSerializer
|
||||||
# --------------------------------------------
|
# --------------------------------------------
|
||||||
|
|
||||||
def raise_errors_on_nested_writes(method_name, serializer, validated_data, model_field_info):
|
def raise_errors_on_nested_writes(method_name, serializer, validated_data):
|
||||||
"""
|
"""
|
||||||
Give explicit errors when users attempt to pass writable nested data.
|
Give explicit errors when users attempt to pass writable nested data.
|
||||||
|
|
||||||
|
@ -791,6 +791,8 @@ def raise_errors_on_nested_writes(method_name, serializer, validated_data, model
|
||||||
* Silently ignore the nested part of the update.
|
* Silently ignore the nested part of the update.
|
||||||
* Automatically create a profile instance.
|
* Automatically create a profile instance.
|
||||||
"""
|
"""
|
||||||
|
ModelClass = serializer.Meta.model
|
||||||
|
model_field_info = model_meta.get_field_info(ModelClass)
|
||||||
|
|
||||||
# Ensure we don't have a writable nested field. For example:
|
# Ensure we don't have a writable nested field. For example:
|
||||||
#
|
#
|
||||||
|
@ -820,9 +822,7 @@ def raise_errors_on_nested_writes(method_name, serializer, validated_data, model
|
||||||
# ...
|
# ...
|
||||||
# address = serializer.CharField('profile.address')
|
# address = serializer.CharField('profile.address')
|
||||||
#
|
#
|
||||||
# Though, we can have a dotted field if it is not expressing a model relation.
|
# Though, non-relational fields (e.g., JSONField) are acceptable. For example:
|
||||||
#
|
|
||||||
# For example:
|
|
||||||
#
|
#
|
||||||
# class NonRelationalPersonModel(models.Model):
|
# class NonRelationalPersonModel(models.Model):
|
||||||
# profile = JSONField()
|
# profile = JSONField()
|
||||||
|
@ -931,7 +931,7 @@ class ModelSerializer(Serializer):
|
||||||
ModelClass = self.Meta.model
|
ModelClass = self.Meta.model
|
||||||
info = model_meta.get_field_info(ModelClass)
|
info = model_meta.get_field_info(ModelClass)
|
||||||
|
|
||||||
raise_errors_on_nested_writes('create', self, validated_data, info)
|
raise_errors_on_nested_writes('create', self, validated_data)
|
||||||
|
|
||||||
# Remove many-to-many relationships from validated_data.
|
# Remove many-to-many relationships from validated_data.
|
||||||
# They are not valid arguments to the default `.create()` method,
|
# They are not valid arguments to the default `.create()` method,
|
||||||
|
@ -973,7 +973,7 @@ class ModelSerializer(Serializer):
|
||||||
|
|
||||||
def update(self, instance, validated_data):
|
def update(self, instance, validated_data):
|
||||||
info = model_meta.get_field_info(instance)
|
info = model_meta.get_field_info(instance)
|
||||||
raise_errors_on_nested_writes('update', self, validated_data, info)
|
raise_errors_on_nested_writes('update', self, validated_data)
|
||||||
|
|
||||||
# Simply set each attribute on the instance, and then save it.
|
# Simply set each attribute on the instance, and then save it.
|
||||||
# Note that unlike `.create()` we don't need to treat many-to-many
|
# Note that unlike `.create()` we don't need to treat many-to-many
|
||||||
|
|
|
@ -6,7 +6,6 @@ from django.test import TestCase
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from rest_framework.compat import postgres_fields
|
from rest_framework.compat import postgres_fields
|
||||||
from rest_framework.serializers import raise_errors_on_nested_writes
|
from rest_framework.serializers import raise_errors_on_nested_writes
|
||||||
from rest_framework.utils import model_meta
|
|
||||||
|
|
||||||
|
|
||||||
class TestNestedSerializer:
|
class TestNestedSerializer:
|
||||||
|
@ -307,7 +306,13 @@ class TestNestedWriteErrors(TestCase):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif('not postgres_fields')
|
if postgres_fields:
|
||||||
|
class NonRelationalPersonModel(models.Model):
|
||||||
|
"""Model declaring a postgres JSONField"""
|
||||||
|
data = postgres_fields.JSONField()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(not postgres_fields, reason='psycopg2 is not installed')
|
||||||
class TestNestedNonRelationalFieldWrite:
|
class TestNestedNonRelationalFieldWrite:
|
||||||
"""
|
"""
|
||||||
Test that raise_errors_on_nested_writes does not raise `AssertionError` when the
|
Test that raise_errors_on_nested_writes does not raise `AssertionError` when the
|
||||||
|
@ -315,9 +320,6 @@ class TestNestedNonRelationalFieldWrite:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def test_nested_serializer_create_and_update(self):
|
def test_nested_serializer_create_and_update(self):
|
||||||
class NonRelationalPersonModel(models.Model):
|
|
||||||
"""Model declaring a postgres JSONField"""
|
|
||||||
data = postgres_fields.JSONField()
|
|
||||||
|
|
||||||
class NonRelationalPersonDataSerializer(serializers.Serializer):
|
class NonRelationalPersonDataSerializer(serializers.Serializer):
|
||||||
occupation = serializers.CharField()
|
occupation = serializers.CharField()
|
||||||
|
@ -332,15 +334,10 @@ class TestNestedNonRelationalFieldWrite:
|
||||||
serializer = NonRelationalPersonSerializer(data={'data': {'occupation': 'developer'}})
|
serializer = NonRelationalPersonSerializer(data={'data': {'occupation': 'developer'}})
|
||||||
assert serializer.is_valid()
|
assert serializer.is_valid()
|
||||||
assert serializer.validated_data == {'data': {'occupation': 'developer'}}
|
assert serializer.validated_data == {'data': {'occupation': 'developer'}}
|
||||||
ModelClass = serializer.Meta.model
|
raise_errors_on_nested_writes('create', serializer, serializer.validated_data)
|
||||||
info = model_meta.get_field_info(ModelClass)
|
raise_errors_on_nested_writes('update', serializer, serializer.validated_data)
|
||||||
raise_errors_on_nested_writes('create', serializer, serializer.validated_data, info)
|
|
||||||
raise_errors_on_nested_writes('update', serializer, serializer.validated_data, info)
|
|
||||||
|
|
||||||
def test_dotted_source_field_create_and_update(self):
|
def test_dotted_source_field_create_and_update(self):
|
||||||
class NonRelationalPersonModel(models.Model):
|
|
||||||
"""Model declaring a postgres JSONField"""
|
|
||||||
data = postgres_fields.JSONField()
|
|
||||||
|
|
||||||
class DottedNonRelationalPersonSerializer(serializers.ModelSerializer):
|
class DottedNonRelationalPersonSerializer(serializers.ModelSerializer):
|
||||||
occupation = serializers.CharField(source='data.occupation')
|
occupation = serializers.CharField(source='data.occupation')
|
||||||
|
@ -352,8 +349,5 @@ class TestNestedNonRelationalFieldWrite:
|
||||||
serializer = DottedNonRelationalPersonSerializer(data={'occupation': 'developer'})
|
serializer = DottedNonRelationalPersonSerializer(data={'occupation': 'developer'})
|
||||||
assert serializer.is_valid()
|
assert serializer.is_valid()
|
||||||
assert serializer.validated_data == {'data': {'occupation': 'developer'}}
|
assert serializer.validated_data == {'data': {'occupation': 'developer'}}
|
||||||
ModelClass = serializer.Meta.model
|
raise_errors_on_nested_writes('create', serializer, serializer.validated_data)
|
||||||
info = model_meta.get_field_info(ModelClass)
|
raise_errors_on_nested_writes('update', serializer, serializer.validated_data)
|
||||||
raise_errors_on_nested_writes('create', serializer, serializer.validated_data, info)
|
|
||||||
raise_errors_on_nested_writes('update', serializer, serializer.validated_data, info)
|
|
||||||
assert serializer.data == {'occupation': 'developer'}
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user