Нави Гатор
Спасибо. Про monkeypatch_query_method то я знаю, именно из него вызывается setattr, но насколько я понял метод select_by он вытаскивает прямо из Query. А как бы его заставить цеплять свой select_by? Все-таки сырцы sqlalchemy менять как-то не хочется.
Это то, что ты хотел?
from elixir import *
from elixir.entity import EntityMeta
metadata.connect(“sqlite:///sample.sqlite”)
class SelectDescr(object):
def __init__(self, cls, fixed_name):
self._cls = cls
self._old_select_by = cls.select_by
self._fixed_name = fixed_name
def __get__(self, instance, owner):
def f(*args, **kwargs):
new_kw = dict()
new_kw.update(kwargs)
if self._fixed_name is not None:
new_kw = self._fixed_name
return self._old_select_by(instance, *args, **new_kw)
return f
class PersonMeta(EntityMeta):
def __init__(cls, name, bases, dict_):
EntityMeta.__init__(cls, name, bases, dict_)
cls.select_by = SelectDescr(cls, getattr(cls, ‘fixed_name’, None))
class Person(Entity):
__metaclass__ = PersonMeta
has_field('name', Unicode(255))
def __repr__(self):
return ‘Person @ 0x%08x (%s)’%(id(self), self.name)
#instrument(Person)
#Person.select_by = SelectDescr(Person)
drop_all()
create_all()
def fill():
p = Person(name='Jack')
p2 = Person(name='John')
objectstore.flush()
fill()
print Person.select_by()
print Person.select_by(name='Jack')
class Jack(Person):
fixed_name = ‘Jack’
print Jack.select_by()
Если нет - давай отталкиваться от примера и выяснять, что таки нужно.