Skip to content

Commit 7ed9d1e

Browse files
gcbirzanPierre Chiquet
authored andcommitted
encode#5848 Allow traversing nullable related fields (encode#5849)
1 parent 0635f14 commit 7ed9d1e

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

rest_framework/relations.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ def get_attribute(self, instance):
174174
pass
175175

176176
# Standard case, return the object instance.
177-
return get_attribute(instance, self.source_attrs)
177+
return super(RelatedField, self).get_attribute(instance)
178178

179179
def get_choices(self, cutoff=None):
180180
queryset = self.get_queryset()

tests/test_model_serializer.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
from rest_framework import serializers
2424
from rest_framework.compat import postgres_fields, unicode_repr
2525

26+
from .models import NestedForeignKeySource
27+
2628

2729
def dedent(blocktext):
2830
return '\n'.join([line[12:] for line in blocktext.splitlines()[1:-1]])
@@ -1164,6 +1166,25 @@ class Meta:
11641166

11651167

11661168
class TestFieldSource(TestCase):
1169+
def test_traverse_nullable_fk(self):
1170+
"""
1171+
A dotted source with nullable elements uses default when any item in the chain is None. #5849.
1172+
1173+
Similar to model example from test_serializer.py `test_default_for_multiple_dotted_source` method,
1174+
but using RelatedField, rather than CharField.
1175+
"""
1176+
class TestSerializer(serializers.ModelSerializer):
1177+
target = serializers.PrimaryKeyRelatedField(
1178+
source='target.target', read_only=True, allow_null=True, default=None
1179+
)
1180+
1181+
class Meta:
1182+
model = NestedForeignKeySource
1183+
fields = ('target', )
1184+
1185+
model = NestedForeignKeySource.objects.create()
1186+
assert TestSerializer(model).data['target'] is None
1187+
11671188
def test_named_field_source(self):
11681189
class TestSerializer(serializers.ModelSerializer):
11691190

0 commit comments

Comments
 (0)