def add_reverse_relation_model_field(cls, fields, model_field, meta, **kwargs): if django_utils.is_reverse_relation_field(model_field): field_name = django_utils.get_reverse_related_name_from_field(model_field) relation_parents_manager = meta.parents.get_working_copy() rel_django_model = django_utils.get_related_model_from_field(model_field) if not relation_parents_manager.handle(rel_django_model): return None field_kwargs = meta.field_arguments.get_nested_field_kwargs(field_name) serializer_cls = cls.get_nested_serializer_class(rel_django_model, relation_parents_manager, **field_kwargs) if django_utils.is_reverse_one2one_relation_field(model_field): field_class = serializer_fields.SerializerField else: field_class = RelatedManagerListSerializerField kwargs = meta.field_arguments.parse(model_field.name, **kwargs) _field = field_class(serializer_cls, required=False, **kwargs) _field.add_name(django_utils.get_reverse_related_name_from_field(model_field)) fields[field_name] = _field return _field return None
def set_fields_from_model(cls, new_class, fields, meta): if django_models is None or meta.model is None: return meta.parents.handle(meta.model) all_field_names = cls.get_all_fieldnames(fields) for model_field in django_utils.get_local_fields(meta.model): if model_field.name not in all_field_names: serializer_field = cls.add_local_model_field(fields, model_field, meta=meta) if serializer_field: setattr(new_class, model_field.name, serializer_field) for model_field in django_utils.get_related_fields(meta.model): if model_field.name not in all_field_names: serializer_field = cls.add_relation_model_field(fields, model_field, meta=meta) if serializer_field: setattr(new_class, model_field.name, serializer_field) for model_field in django_utils.get_reverse_related_fields(meta.model): field_name = django_utils.get_reverse_related_name_from_field(model_field) if field_name not in all_field_names: serializer_field = cls.add_reverse_relation_model_field(fields, model_field, meta=meta) if serializer_field: setattr(new_class, field_name, serializer_field)