@@ -50,6 +50,17 @@ class Meta:
5050 fields = ('url' , 'name' , 'sources' )
5151
5252
53+ class ForeignKeyTargetCallableSourceSerializer (serializers .HyperlinkedModelSerializer ):
54+ class Meta :
55+ model = ForeignKeyTarget
56+ fields = ('url' , 'name' , 'first_source' )
57+
58+ first_source = serializers .HyperlinkedRelatedField (
59+ read_only = True ,
60+ source = 'get_first_source' ,
61+ view_name = 'foreignkeysource-detail' )
62+
63+
5364class ForeignKeySourceSerializer (serializers .HyperlinkedModelSerializer ):
5465 class Meta :
5566 model = ForeignKeySource
@@ -444,3 +455,22 @@ def test_reverse_foreign_key_retrieve_with_null(self):
444455 {'url' : 'http://testserver/onetoonetarget/2/' , 'name' : 'target-2' , 'nullable_source' : None },
445456 ]
446457 self .assertEqual (serializer .data , expected )
458+
459+
460+ class HyperlinkedRelationCallableSourceTests (TestCase ):
461+ urls = 'tests.test_relations_hyperlink'
462+
463+ def setUp (self ):
464+ self .target = ForeignKeyTarget .objects .create (name = 'target-1' )
465+ ForeignKeySource .objects .create (name = 'source-1' , target = self .target )
466+ ForeignKeySource .objects .create (name = 'source-2' , target = self .target )
467+
468+ def test_relation_field_callable_source (self ):
469+ serializer = ForeignKeyTargetCallableSourceSerializer (self .target , context = {'request' : request })
470+ expected = {
471+ 'url' : 'http://testserver/foreignkeytarget/1/' ,
472+ 'name' : 'target-1' ,
473+ 'first_source' : 'http://testserver/foreignkeysource/1/' ,
474+ }
475+ with self .assertNumQueries (1 ):
476+ self .assertEqual (serializer .data , expected )
0 commit comments