def create_intermediary_model(m2m, model, name): is_polymorph = m2m.to_field is None if is_polymorph: source, target = m2m.rel.to, model else: source, target = model, m2m.rel.to if source._meta.abstract: return None if not is_polymorph: table = m2m.to_field.rel.through._meta.db_table elif m2m.explicit_db_table: table = m2m.explicit_db_table else: table = "%s_%s_%s_rel" % (model._meta.app_label, model.__name__.lower(), name) on_delete = models.CASCADE if is_polymorph else models.DO_NOTHING, attrs = dict( obj = models.ForeignKey(source, related_name=no_related_name(), on_delete=on_delete), rel_obj = models.ForeignKey(target, related_name=no_related_name(), on_delete=on_delete), Meta = type('Meta', (object,), dict( managed=is_polymorph, db_table=table, auto_created=model, unique_together=('obj', 'rel_obj'), )), __module__ = target.__module__, ) through = type('%s%s' % (model.__name__, camel_case(name, True)), (models.Model,), attrs) return through
def create_intermediate_model(cls, rel_name, attrs, bases=None, meta=None): if not meta: meta = {} if not bases: bases = (models.Model,) meta.setdefault('app_label', cls._meta.app_label) attrs['Meta'] = type('Meta', (object,), meta) attrs.setdefault('__module__', cls.__module__) return type("%s%s" % (cls.__name__, camel_case(rel_name, True)), bases, attrs)