Skip to content

Commit 247cf09

Browse files
Test using model objects for dotted source default (#5880)
… when path components may be null. Ref #5375, #5727
1 parent 0da4617 commit 247cf09

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

tests/models.py

Lines changed: 11 additions & 0 deletions
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

Lines changed: 19 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy