Skip to content

Commit 5d40e76

Browse files
committed
Test using model objects for dotted source default
… when path components may be null. Ref #5375, #5727
1 parent 0da4617 commit 5d40e76

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

tests/models.py

+11
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,17 @@ class NullableUUIDForeignKeySource(RESTFrameworkModel):
6969
on_delete=models.CASCADE)
7070

7171

72+
class NestedForeignKeySource(RESTFrameworkModel):
73+
"""
74+
Used for testing FK chain. A -> B -> C.
75+
"""
76+
name = models.CharField(max_length=100)
77+
target = models.ForeignKey(NullableForeignKeySource, null=True, blank=True,
78+
related_name='nested_sources',
79+
verbose_name='Intermediate target object',
80+
on_delete=models.CASCADE)
81+
82+
7283
# OneToOne
7384
class OneToOneTarget(RESTFrameworkModel):
7485
name = models.CharField(max_length=100)

tests/test_serializer.py

+19
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
from rest_framework.compat import unicode_repr
1515
from rest_framework.fields import Field
1616

17+
from .models import (
18+
ForeignKeyTarget, NestedForeignKeySource, NullableForeignKeySource
19+
)
1720
from .utils import MockObject
1821

1922
try:
@@ -453,6 +456,22 @@ class Serializer(serializers.Serializer):
453456

454457
assert Serializer({'a': {'b': {'c': 'abc'}}}).data == {'c': 'abc'}
455458

459+
# Same test using model objects to exercise both paths in
460+
# rest_framework.fields.get_attribute() (#5880)
461+
class ModelSerializer(serializers.Serializer):
462+
target = serializers.CharField(default='x', source='target.target.name')
463+
464+
a = NestedForeignKeySource(name="Root Object", target=None)
465+
assert ModelSerializer(a).data == {'target': 'x'}
466+
467+
b = NullableForeignKeySource(name="Intermediary Object", target=None)
468+
a.target = b
469+
assert ModelSerializer(a).data == {'target': 'x'}
470+
471+
c = ForeignKeyTarget(name="Target Object")
472+
b.target = c
473+
assert ModelSerializer(a).data == {'target': 'Target Object'}
474+
456475
def test_default_for_nested_serializer(self):
457476
class NestedSerializer(serializers.Serializer):
458477
a = serializers.CharField(default='1')

0 commit comments

Comments
 (0)