@@ -1021,6 +1021,73 @@ class Meta:
10211021 assert serializer .data == expected
10221022
10231023
1024+ class Issue7550FooModel (models .Model ):
1025+ text = models .CharField (max_length = 100 )
1026+ bar = models .ForeignKey (
1027+ 'Issue7550BarModel' , null = True , blank = True , on_delete = models .SET_NULL ,
1028+ related_name = 'foos' , related_query_name = 'foo' )
1029+
1030+
1031+ class Issue7550BarModel (models .Model ):
1032+ pass
1033+
1034+
1035+ class Issue7550TestCase (TestCase ):
1036+
1037+ def test_dotted_source (self ):
1038+
1039+ class _FooSerializer (serializers .ModelSerializer ):
1040+ class Meta :
1041+ model = Issue7550FooModel
1042+ fields = ('id' , 'text' )
1043+
1044+ class FooSerializer (serializers .ModelSerializer ):
1045+ other_foos = _FooSerializer (source = 'bar.foos' , many = True )
1046+
1047+ class Meta :
1048+ model = Issue7550BarModel
1049+ fields = ('id' , 'other_foos' )
1050+
1051+ bar = Issue7550BarModel .objects .create ()
1052+ foo_a = Issue7550FooModel .objects .create (bar = bar , text = 'abc' )
1053+ foo_b = Issue7550FooModel .objects .create (bar = bar , text = '123' )
1054+
1055+ assert FooSerializer (foo_a ).data == {
1056+ 'id' : foo_a .id ,
1057+ 'other_foos' : [
1058+ {
1059+ 'id' : foo_a .id ,
1060+ 'text' : foo_a .text ,
1061+ },
1062+ {
1063+ 'id' : foo_b .id ,
1064+ 'text' : foo_b .text ,
1065+ },
1066+ ],
1067+ }
1068+
1069+ def test_dotted_source_with_default (self ):
1070+
1071+ class _FooSerializer (serializers .ModelSerializer ):
1072+ class Meta :
1073+ model = Issue7550FooModel
1074+ fields = ('id' , 'text' )
1075+
1076+ class FooSerializer (serializers .ModelSerializer ):
1077+ other_foos = _FooSerializer (source = 'bar.foos' , default = [], many = True )
1078+
1079+ class Meta :
1080+ model = Issue7550BarModel
1081+ fields = ('id' , 'other_foos' )
1082+
1083+ foo = Issue7550FooModel .objects .create (bar = None , text = 'abc' )
1084+
1085+ assert FooSerializer (foo ).data == {
1086+ 'id' : foo .id ,
1087+ 'other_foos' : [],
1088+ }
1089+
1090+
10241091class DecimalFieldModel (models .Model ):
10251092 decimal_field = models .DecimalField (
10261093 max_digits = 3 ,
0 commit comments