def index_model(self, index, fields=None): model_name = class_name_from_parts(index.name, 'index') class Meta: apps = self.apps app_label = 'indexing' db_table = db_table_for_index(index) attrs = {'Meta': Meta, '__module__': '__fake__'} fields = index.fields if fields is None else fields for field_name, index_field in six.iteritems(fields): if not index_field.multi_value: db_field = db_field_for_index_field(field_name, index_field) attrs[field_name] = db_field model = type(model_name, (models.Model, ), attrs) related_models = {} for field_name, index_field in six.iteritems(fields): if index_field.multi_value: related_model = self.index_multi_value_field( index, model, field_name, index_field ) related_models[field_name] = related_model return model, related_models
def index_multi_value_field( self, index, index_model, field_name, index_field ): model_name = class_name_from_parts(index.name, 'index', field_name) class Meta: apps = self.apps app_label = 'indexing' db_table = db_table_for_index(index, field_name) attrs = { 'Meta': Meta, '__module__': '__fake__', 'index': models.ForeignKey( index_model, related_name=field_name ), 'value': db_field_for_index_field('value', index_field) } model = type(model_name, (models.Model, ), attrs) return model