@@ -30,6 +30,25 @@ class Meta:
3030 fields = ('id' , 'name' , 'sources' )
3131
3232
33+ class ForeignKeyTargetCallableSourceSerializer (serializers .ModelSerializer ):
34+ first_source = serializers .PrimaryKeyRelatedField (
35+ source = 'get_first_source' ,
36+ read_only = True ,
37+ )
38+
39+ class Meta :
40+ model = ForeignKeyTarget
41+ fields = ('id' , 'name' , 'first_source' )
42+
43+
44+ class ForeignKeyTargetPropertySourceSerializer (serializers .ModelSerializer ):
45+ first_source = serializers .PrimaryKeyRelatedField (read_only = True )
46+
47+ class Meta :
48+ model = ForeignKeyTarget
49+ fields = ('id' , 'name' , 'first_source' )
50+
51+
3352class ForeignKeySourceSerializer (serializers .ModelSerializer ):
3453 class Meta :
3554 model = ForeignKeySource
@@ -389,6 +408,34 @@ class Meta:
389408 assert len (queryset ) == 1
390409
391410
411+ class PKRelationTests (TestCase ):
412+
413+ def setUp (self ):
414+ self .target = ForeignKeyTarget .objects .create (name = 'target-1' )
415+ ForeignKeySource .objects .create (name = 'source-1' , target = self .target )
416+ ForeignKeySource .objects .create (name = 'source-2' , target = self .target )
417+
418+ def test_relation_field_callable_source (self ):
419+ serializer = ForeignKeyTargetCallableSourceSerializer (self .target )
420+ expected = {
421+ 'id' : 1 ,
422+ 'name' : 'target-1' ,
423+ 'first_source' : 1 ,
424+ }
425+ with self .assertNumQueries (1 ):
426+ self .assertEqual (serializer .data , expected )
427+
428+ def test_relation_field_property_source (self ):
429+ serializer = ForeignKeyTargetPropertySourceSerializer (self .target )
430+ expected = {
431+ 'id' : 1 ,
432+ 'name' : 'target-1' ,
433+ 'first_source' : 1 ,
434+ }
435+ with self .assertNumQueries (1 ):
436+ self .assertEqual (serializer .data , expected )
437+
438+
392439class PKNullableForeignKeyTests (TestCase ):
393440 def setUp (self ):
394441 target = ForeignKeyTarget (name = 'target-1' )
0 commit comments