Вот мой взгляд на фабрику ваших классов:
def factory(db, tablename):
fields = {
'_table': tablename,
'first_name': Required(str)
# rest of the fields
}
table_template = type(tablename.capitalize(),(db.Entity,),fields)
return table_template
Это создаст класс, используя заглавные буквы в tablename
и установив дескрипторы.Я не уверен насчет метаклассов, хотя
ОБНОВЛЕНИЕ НА composite_index
ВЫПУСК
composite_index
использует некоторые довольно неясные функции, вызывая этот метод:
def _define_index(func_name, attrs, is_unique=False):
if len(attrs) < 2: throw(TypeError,
'%s() must receive at least two attributes as arguments' % func_name)
cls_dict = sys._getframe(2).f_locals
indexes = cls_dict.setdefault('_indexes_', [])
indexes.append(Index(*attrs, is_pk=False, is_unique=is_unique))
Небольшой эксперимент показывает, что вы можете выполнить то же самое, добавив поле самостоятельно.Таким образом, наша фабричная fields
переменная выглядит следующим образом:
fields = {
'_table': tablename,
'first_name': Required(str),
'_indexes_':[Index(('first_name','last_name'),is_pk=False,is_unique=False)]
# rest of the fields
}
Попробуйте и дайте мне знать.
ОБНОВЛЕНИЕ НА ЭКСПЕРИМЕНТЕ OP
Окончательный код будет выглядеть примерно так:
from pony.orm import *
from pony.orm.core import Index
def factory(db, tablename):
fields = {
'_table': tablename,
'first_name': Required(str)
# rest of the fields
}
fields['_indexes_'] = [Index(fields['first_name'],fields['last_name'],is_pk=False,is_unique=False)]
table_template = type(tablename.capitalize(),(db.Entity,),fields)
return table_template