Commit 3a06dde8 by Tom Christie

Clean up field classes

parent d89d6887
...@@ -123,16 +123,8 @@ class BaseSerializer(Field): ...@@ -123,16 +123,8 @@ class BaseSerializer(Field):
# Get the explicitly declared fields # Get the explicitly declared fields
for key, field in self.fields.items(): for key, field in self.fields.items():
ret[key] = field ret[key] = field
# Determine if the declared field corrosponds to a model field.
try:
if key == 'pk':
model_field = obj._meta.pk
else:
model_field = obj._meta.get_field_by_name(key)[0]
except:
model_field = None
# Set up the field # Set up the field
field.initialize(parent=self, model_field=model_field) field.initialize(parent=self)
# Add in the default fields # Add in the default fields
fields = self.default_fields(serialize, obj, data, nested) fields = self.default_fields(serialize, obj, data, nested)
...@@ -157,12 +149,12 @@ class BaseSerializer(Field): ...@@ -157,12 +149,12 @@ class BaseSerializer(Field):
##### #####
# Field methods - used when the serializer class is itself used as a field. # Field methods - used when the serializer class is itself used as a field.
def initialize(self, parent, model_field=None): def initialize(self, parent):
""" """
Same behaviour as usual Field, except that we need to keep track Same behaviour as usual Field, except that we need to keep track
of state so that we can deal with handling maximum depth and recursion. of state so that we can deal with handling maximum depth and recursion.
""" """
super(BaseSerializer, self).initialize(parent, model_field) super(BaseSerializer, self).initialize(parent)
self.stack = parent.stack[:] self.stack = parent.stack[:]
if parent.opts.nested and not isinstance(parent.opts.nested, bool): if parent.opts.nested and not isinstance(parent.opts.nested, bool):
self.opts.nested = parent.opts.nested - 1 self.opts.nested = parent.opts.nested - 1
...@@ -296,12 +288,22 @@ class ModelSerializerOptions(SerializerOptions): ...@@ -296,12 +288,22 @@ class ModelSerializerOptions(SerializerOptions):
self.model = getattr(meta, 'model', None) self.model = getattr(meta, 'model', None)
class ModelSerializer(RelatedField, Serializer): class ModelSerializer(Serializer):
""" """
A serializer that deals with model instances and querysets. A serializer that deals with model instances and querysets.
""" """
_options_class = ModelSerializerOptions _options_class = ModelSerializerOptions
def field_to_native(self, obj, field_name):
"""
Override default so that we can apply ModelSerializer as a nested
field to relationships.
"""
obj = getattr(obj, self.source or field_name)
if obj.__class__.__name__ in ('RelatedManager', 'ManyRelatedManager'):
return [self.to_native(item) for item in obj.all()]
return self.to_native(obj)
def default_fields(self, serialize, obj=None, data=None, nested=False): def default_fields(self, serialize, obj=None, data=None, nested=False):
""" """
Return all the fields that should be serialized for the model. Return all the fields that should be serialized for the model.
...@@ -330,7 +332,7 @@ class ModelSerializer(RelatedField, Serializer): ...@@ -330,7 +332,7 @@ class ModelSerializer(RelatedField, Serializer):
field = self.get_field(model_field) field = self.get_field(model_field)
if field: if field:
field.initialize(parent=self, model_field=model_field) field.initialize(parent=self)
ret[model_field.name] = field ret[model_field.name] = field
return ret return ret
...@@ -339,7 +341,7 @@ class ModelSerializer(RelatedField, Serializer): ...@@ -339,7 +341,7 @@ class ModelSerializer(RelatedField, Serializer):
""" """
Returns a default instance of the pk field. Returns a default instance of the pk field.
""" """
return Field(readonly=True) return Field()
def get_nested_field(self, model_field): def get_nested_field(self, model_field):
""" """
...@@ -373,7 +375,7 @@ class ModelSerializer(RelatedField, Serializer): ...@@ -373,7 +375,7 @@ class ModelSerializer(RelatedField, Serializer):
try: try:
return field_mapping[model_field.__class__]() return field_mapping[model_field.__class__]()
except KeyError: except KeyError:
return Field() return ModelField(model_field=model_field)
def restore_object(self, attrs, instance=None): def restore_object(self, attrs, instance=None):
""" """
......
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