@@ -89,6 +89,15 @@ class ChoicesModel(models.Model):
89
89
choices_field_with_nonstandard_args = models .DecimalField (max_digits = 3 , decimal_places = 1 , choices = DECIMAL_CHOICES , verbose_name = 'A label' )
90
90
91
91
92
+ class Issue3674ParentModel (models .Model ):
93
+ title = models .CharField (max_length = 64 )
94
+
95
+
96
+ class Issue3674ChildModel (models .Model ):
97
+ parent = models .ForeignKey (Issue3674ParentModel , related_name = 'children' )
98
+ value = models .CharField (primary_key = True , max_length = 64 )
99
+
100
+
92
101
class TestModelSerializer (TestCase ):
93
102
def test_create_method (self ):
94
103
class TestSerializer (serializers .ModelSerializer ):
@@ -996,3 +1005,62 @@ class Meta:
996
1005
fields = TestSerializer ().fields
997
1006
self .assertFalse (fields ['field_1' ].required )
998
1007
self .assertTrue (fields ['field_2' ].required )
1008
+
1009
+
1010
+ class Issue3674Test (TestCase ):
1011
+ def test_nonPK_foreignkey_model_serializer (self ):
1012
+ class TestParentModel (models .Model ):
1013
+ title = models .CharField (max_length = 64 )
1014
+
1015
+ class TestChildModel (models .Model ):
1016
+ parent = models .ForeignKey (TestParentModel , related_name = 'children' )
1017
+ value = models .CharField (primary_key = True , max_length = 64 )
1018
+
1019
+ class TestChildModelSerializer (serializers .ModelSerializer ):
1020
+ class Meta :
1021
+ model = TestChildModel
1022
+ fields = ('value' , 'parent' )
1023
+
1024
+ class TestParentModelSerializer (serializers .ModelSerializer ):
1025
+ class Meta :
1026
+ model = TestParentModel
1027
+ fields = ('id' , 'title' , 'children' )
1028
+
1029
+ parent_expected = dedent ("""
1030
+ TestParentModelSerializer():
1031
+ id = IntegerField(label='ID', read_only=True)
1032
+ title = CharField(max_length=64)
1033
+ children = PrimaryKeyRelatedField(many=True, queryset=TestChildModel.objects.all())
1034
+ """ )
1035
+ self .assertEqual (unicode_repr (TestParentModelSerializer ()), parent_expected )
1036
+
1037
+ child_expected = dedent ("""
1038
+ TestChildModelSerializer():
1039
+ value = CharField(max_length=64, validators=[<UniqueValidator(queryset=TestChildModel.objects.all())>])
1040
+ parent = PrimaryKeyRelatedField(queryset=TestParentModel.objects.all())
1041
+ """ )
1042
+ self .assertEqual (unicode_repr (TestChildModelSerializer ()), child_expected )
1043
+
1044
+ def test_nonID_PK_foreignkey_model_serializer (self ):
1045
+
1046
+ class TestChildModelSerializer (serializers .ModelSerializer ):
1047
+ class Meta :
1048
+ model = Issue3674ChildModel
1049
+ fields = ('value' , 'parent' )
1050
+
1051
+ class TestParentModelSerializer (serializers .ModelSerializer ):
1052
+ class Meta :
1053
+ model = Issue3674ParentModel
1054
+ fields = ('id' , 'title' , 'children' )
1055
+
1056
+ parent = Issue3674ParentModel .objects .create (title = 'abc' )
1057
+ child = Issue3674ChildModel .objects .create (value = 'def' , parent = parent )
1058
+
1059
+ parent_serializer = TestParentModelSerializer (parent )
1060
+ child_serializer = TestChildModelSerializer (child )
1061
+
1062
+ parent_expected = {'children' : ['def' ], 'id' : 1 , 'title' : 'abc' }
1063
+ self .assertEqual (parent_serializer .data , parent_expected )
1064
+
1065
+ child_expected = {'parent' : 1 , 'value' : 'def' }
1066
+ self .assertEqual (child_serializer .data , child_expected )
0 commit comments