@@ -894,48 +894,8 @@ class ModelSerializer(Serializer):
894
894
* A set of default validators are automatically populated.
895
895
* Default `.create()` and `.update()` implementations are provided.
896
896
897
- The process of automatically determining a set of serializer fields
898
- based on the model fields is reasonably complex, but you almost certainly
899
- don't need to dig into the implementation.
900
-
901
- If the `ModelSerializer` class *doesn't* generate the set of fields that
902
- you need you should either declare the extra/differing fields explicitly on
903
- the serializer class, or simply use a `Serializer` class.
904
897
"""
905
- serializer_field_mapping = {
906
- models .AutoField : IntegerField ,
907
- models .BigIntegerField : IntegerField ,
908
- models .BooleanField : BooleanField ,
909
- models .CharField : CharField ,
910
- models .CommaSeparatedIntegerField : CharField ,
911
- models .DateField : DateField ,
912
- models .DateTimeField : DateTimeField ,
913
- models .DecimalField : DecimalField ,
914
- models .DurationField : DurationField ,
915
- models .EmailField : EmailField ,
916
- models .Field : ModelField ,
917
- models .FileField : FileField ,
918
- models .FloatField : FloatField ,
919
- models .ImageField : ImageField ,
920
- models .IntegerField : IntegerField ,
921
- models .NullBooleanField : BooleanField ,
922
- models .PositiveIntegerField : IntegerField ,
923
- models .PositiveSmallIntegerField : IntegerField ,
924
- models .SlugField : SlugField ,
925
- models .SmallIntegerField : IntegerField ,
926
- models .TextField : CharField ,
927
- models .TimeField : TimeField ,
928
- models .URLField : URLField ,
929
- models .UUIDField : UUIDField ,
930
- models .GenericIPAddressField : IPAddressField ,
931
- models .FilePathField : FilePathField ,
932
- }
933
- if hasattr (models , 'JSONField' ):
934
- serializer_field_mapping [models .JSONField ] = JSONField
935
- if postgres_fields :
936
- serializer_field_mapping [postgres_fields .HStoreField ] = HStoreField
937
- serializer_field_mapping [postgres_fields .ArrayField ] = ListField
938
- serializer_field_mapping [postgres_fields .JSONField ] = JSONField
898
+
939
899
serializer_related_field = PrimaryKeyRelatedField
940
900
serializer_related_to_field = SlugRelatedField
941
901
serializer_url_field = HyperlinkedIdentityField
@@ -950,6 +910,61 @@ class ModelSerializer(Serializer):
950
910
# "HTTP 201 Created" responses.
951
911
url_field_name = None
952
912
913
+ @property
914
+ def serializer_field_mapping (self ) -> dict [type [models .Field ], type [Field ]]:
915
+ """Get mapping of django model field to serializer field.
916
+
917
+ The process of automatically determining a set of serializer fields
918
+ based on the model fields is reasonably complex, but you almost certainly
919
+ don't need to dig into the implementation.
920
+
921
+ If the `ModelSerializer` class *doesn't* generate the set of fields that
922
+ you need you should either extend serializer_field_mapping with
923
+ the extra/differing fields explicitly, or simply use a `Serializer`
924
+ class.
925
+
926
+ """
927
+ serializer_field_mapping = {
928
+ models .AutoField : IntegerField ,
929
+ models .BigIntegerField : IntegerField ,
930
+ models .BooleanField : BooleanField ,
931
+ models .CharField : CharField ,
932
+ models .CommaSeparatedIntegerField : CharField ,
933
+ models .DateField : DateField ,
934
+ models .DateTimeField : DateTimeField ,
935
+ models .DecimalField : DecimalField ,
936
+ models .DurationField : DurationField ,
937
+ models .EmailField : EmailField ,
938
+ models .Field : ModelField ,
939
+ models .FileField : FileField ,
940
+ models .FloatField : FloatField ,
941
+ models .ImageField : ImageField ,
942
+ models .IntegerField : IntegerField ,
943
+ models .NullBooleanField : BooleanField ,
944
+ models .PositiveIntegerField : IntegerField ,
945
+ models .PositiveSmallIntegerField : IntegerField ,
946
+ models .SlugField : SlugField ,
947
+ models .SmallIntegerField : IntegerField ,
948
+ models .TextField : CharField ,
949
+ models .TimeField : TimeField ,
950
+ models .URLField : URLField ,
951
+ models .UUIDField : UUIDField ,
952
+ models .GenericIPAddressField : IPAddressField ,
953
+ models .FilePathField : FilePathField ,
954
+ }
955
+ if hasattr (models , 'JSONField' ):
956
+ serializer_field_mapping [models .JSONField ] = JSONField
957
+ if postgres_fields :
958
+ serializer_field_mapping [postgres_fields .HStoreField ] = HStoreField
959
+ serializer_field_mapping [postgres_fields .ArrayField ] = ListField
960
+ serializer_field_mapping [postgres_fields .JSONField ] = JSONField
961
+ for (
962
+ model_field ,
963
+ serializer_field ,
964
+ ) in api_settings .MODEL_SERIALIZER_FIELD_MAPPING .items ():
965
+ serializer_field_mapping [model_field ] = serializer_field
966
+ return serializer_field_mapping
967
+
953
968
# Default `create` and `update` behavior...
954
969
def create (self , validated_data ):
955
970
"""
0 commit comments