Commit 670723f0 by Tom Christie

Minor cleanups/improvements to ModelSerializer API

parent 5d8c3abe
...@@ -577,9 +577,25 @@ Normally if a `ModelSerializer` does not generate the fields you need by default ...@@ -577,9 +577,25 @@ Normally if a `ModelSerializer` does not generate the fields you need by default
A mapping of Django model classes to REST framework serializer classes. You can override this mapping to alter the default serializer classes that should be used for each model class. A mapping of Django model classes to REST framework serializer classes. You can override this mapping to alter the default serializer classes that should be used for each model class.
### `.serializer_relational_field` ### `.serializer_related_field`
This property should be the serializer field class, that is used for relational fields by default. For `ModelSerializer` this defaults to `PrimaryKeyRelatedField`. For `HyperlinkedModelSerializer` this defaults to `HyperlinkedRelatedField`. This property should be the serializer field class, that is used for relational fields by default.
For `ModelSerializer` this defaults to `PrimaryKeyRelatedField`.
For `HyperlinkedModelSerializer` this defaults to `serializers.HyperlinkedRelatedField`.
### `serializer_url_field`
The serializer field class that should be used for any `url` field on the serializer.
Defaults to `serializers.HyperlinkedIdentityField`
### `serializer_choice_field`
The serializer field class that should be used for any choice fields on the serializer.
Defaults to `serializers.ChoiceField`
### The field_class and field_kwargs API ### The field_class and field_kwargs API
......
...@@ -728,7 +728,9 @@ class ModelSerializer(Serializer): ...@@ -728,7 +728,9 @@ class ModelSerializer(Serializer):
models.TimeField: TimeField, models.TimeField: TimeField,
models.URLField: URLField, models.URLField: URLField,
} }
serializer_related_class = PrimaryKeyRelatedField serializer_related_field = PrimaryKeyRelatedField
serializer_url_field = HyperlinkedIdentityField
serializer_choice_field = ChoiceField
# Default `create` and `update` behavior... # Default `create` and `update` behavior...
...@@ -985,7 +987,7 @@ class ModelSerializer(Serializer): ...@@ -985,7 +987,7 @@ class ModelSerializer(Serializer):
if 'choices' in field_kwargs: if 'choices' in field_kwargs:
# Fields with choices get coerced into `ChoiceField` # Fields with choices get coerced into `ChoiceField`
# instead of using their regular typed field. # instead of using their regular typed field.
field_class = ChoiceField field_class = self.serializer_choice_field
if not issubclass(field_class, ModelField): if not issubclass(field_class, ModelField):
# `model_field` is only valid for the fallback case of # `model_field` is only valid for the fallback case of
...@@ -998,11 +1000,12 @@ class ModelSerializer(Serializer): ...@@ -998,11 +1000,12 @@ class ModelSerializer(Serializer):
field_kwargs.pop('allow_blank', None) field_kwargs.pop('allow_blank', None)
if postgres_fields and isinstance(model_field, postgres_fields.ArrayField): if postgres_fields and isinstance(model_field, postgres_fields.ArrayField):
# Populate the `child` argument on `ListField` instances generated
# for the PostgrSQL specfic `ArrayField`.
child_model_field = model_field.base_field child_model_field = model_field.base_field
child_field_class, child_field_kwargs = self.build_standard_field( child_field_class, child_field_kwargs = self.build_standard_field(
'child', child_model_field 'child', child_model_field
) )
field_kwargs['child'] = child_field_class(**child_field_kwargs) field_kwargs['child'] = child_field_class(**child_field_kwargs)
return field_class, field_kwargs return field_class, field_kwargs
...@@ -1011,7 +1014,7 @@ class ModelSerializer(Serializer): ...@@ -1011,7 +1014,7 @@ class ModelSerializer(Serializer):
""" """
Create fields for forward and reverse relationships. Create fields for forward and reverse relationships.
""" """
field_class = self.serializer_related_class field_class = self.serializer_related_field
field_kwargs = get_relation_kwargs(field_name, relation_info) field_kwargs = get_relation_kwargs(field_name, relation_info)
# `view_name` is only valid for hyperlinked relationships. # `view_name` is only valid for hyperlinked relationships.
...@@ -1047,7 +1050,7 @@ class ModelSerializer(Serializer): ...@@ -1047,7 +1050,7 @@ class ModelSerializer(Serializer):
""" """
Create a field representing the object's own URL. Create a field representing the object's own URL.
""" """
field_class = HyperlinkedIdentityField field_class = self.serializer_url_field
field_kwargs = get_url_kwargs(model_class) field_kwargs = get_url_kwargs(model_class)
return field_class, field_kwargs return field_class, field_kwargs
...@@ -1358,7 +1361,7 @@ class HyperlinkedModelSerializer(ModelSerializer): ...@@ -1358,7 +1361,7 @@ class HyperlinkedModelSerializer(ModelSerializer):
* A 'url' field is included instead of the 'id' field. * A 'url' field is included instead of the 'id' field.
* Relationships to other instances are hyperlinks, instead of primary keys. * Relationships to other instances are hyperlinks, instead of primary keys.
""" """
serializer_related_class = HyperlinkedRelatedField serializer_related_field = HyperlinkedRelatedField
def get_default_field_names(self, declared_fields, model_info): def get_default_field_names(self, declared_fields, model_info):
""" """
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment