def build_nested_field(self, field_name, info, relationship, nested_depth):
"""
Builds nested serializer to handle relationshipped model
"""
target_model = relationship.mapper.class_
nested_fields = self.get_nested_relationship_fields(target_model, info, relationship, nested_depth)
field_kwargs = self.get_relationship_kwargs(relationship, nested_depth)
field_kwargs = self.include_extra_kwargs(field_kwargs, self._extra_kwargs.get(field_name))
nested_extra_kwargs = {}
nested_info = model_info(target_model)
if not field_kwargs.get('required', True):
for nested_field in nested_info.primary_keys:
nested_extra_kwargs.setdefault(nested_field, {}).setdefault('required', False)
if not field_kwargs.get('allow_nested_updates', True):
nested_depth = 0
for nested_field in nested_info.properties:
nested_extra_kwargs.setdefault(nested_field, {}).setdefault('read_only', True)
nested_extra_kwargs.setdefault(nested_field, {}).pop('required', None)
class NestedSerializer(ModelSerializer):
class Meta:
model = target_model
session = self.session
depth = max(0, nested_depth - 1)
fields = nested_fields
extra_kwargs = nested_extra_kwargs
return type(target_model.__name__ + 'Serializer', (NestedSerializer, ), {})(**field_kwargs)
评论列表
文章目录