Форум сайта python.su
bismigalis
Не должно работать
Офлайн
Ну да. Как я и думал. Этот класс находится вне маппера…
P.S. Самое, что интересное, что ответ на Ваш вопрос я написал уже во четвертом посте Воду в ступе толчем и толчем. Зато себя заняли хоть как-то
Отредактировано 4kpt_III (Апрель 15, 2015 23:19:10)
Офлайн
4kpt_III
Я наконец-таки понял, что Вы хотите сделать. Самый простой вариант - использовать фиксированный префикс, как я написал выше. Второй вариант значительно хардкорнее. Теперь я его не рекомендую.
Офлайн
4kpt_III
Ну да. Как я и думал. Этот класс находится вне маппера…
P.S. Самое, что интересное, что ответ на Ваш вопрос я написал уже во четвертом посте Воду в ступе толчем и толчем. Зато себя заняли хоть как-то
1. Называть все с одним префиксом и в @declared_attr формировать связь учитывая базовый префикс.
Офлайн
lightarhont
Ну начнем с того, что никаким cls там и не пахло
А по-вопросу:
class OpsUser(SUser, Base): @declared_attr def users(self): fixed_prefix = self.__name__[:self.__name__.find("User")] return relationship(fixed_prefix + "Permissions") # class OpsPermissions(SPermissions, Base):
Отредактировано 4kpt_III (Апрель 15, 2015 23:25:38)
Офлайн
А что если добавить класс в число предков SUsers с новым значением “Users”?
Вот такой:
#CS - construction shemas class CS: __cs__ = {'SUsers': 'User'}
class SBlocks(IDB, PKID, CS): __tablename__ = 'blocks' @declared_attr def user_id(cls): return Column(Integer, ForeignKey('users.id')) @declared_attr def permission_id(cls): return Column(Integer, ForeignKey('permissions.id')) @declared_attr def fromuser_id(cls): return Column(Integer, ForeignKey('users.id')) datestart = Column(Integer) dateend = Column(Integer) blockcomment = Column(Unicode(255)) @declared_attr def users(cls): return relationship(cls.__cs__['SUsers'], uselist=False, primaryjoin="Users.id == %s.user_id" % cls.__name__) @declared_attr def permissions(cls): return relationship("Permissions", uselist=False) @declared_attr def fusers(cls): return relationship(cls.__cs__['SUsers'], uselist=False, primaryjoin="Users.id == %s.fromuser_id" % cls.__name__)
Офлайн
Понимаете, что Вы делаете вызов моделей (для получения данных), которые имеют одинаковые названия. В этом проблема. А не в том, как правильно их подключить. Поэтому самым простым решением является сделать модели с разными именами, но с одними ссылками на таблицы БД. То, что Вы написали не только усложняет но еще и заставляет описывать допустимые согласования в каком-то отдельном классе. Путаете следы как профессиональный заяц-рысак.
P.S. Я же уже говорил, что в declared_attr в вашем случае нет cls там self в чистом виде.
P.S.S. Ну и так вообще-то никто не делает. Не для этого миксины нужны.
Офлайн
В общем решил так вопрос:
Где Base я ипортирую cs
def cs(cs): from testproject.models.shemas import CS setattr(CS, "__cs__", cs)
@declared_attr def users(cls): return relationship(cls.__cs__['SUsers'], uselist=False, primaryjoin="Users.id == %s.user_id" % cls.__name__)
Отредактировано lightarhont (Апрель 16, 2015 15:25:35)
Офлайн
Господи. Какой костыль. Импорт внутри функции вообще яд…
lightarhont
Возможно лучше использовать метакласс, поскольку он автоматически сможет получать имя функции, но что то мне подсказывает, что тут не всё так просто там…
Офлайн
Честно говоря снова провал вышел.
Я думал ошибка иза того что я не указал переменную дальше:
@declared_attr def users(cls): primaryjoin = "%s.id == %s.user_id" % (cls.__cs__['SUsers'], cls.__name__) return relationship(cls.__cs__['SUsers'], uselist=False, primaryjoin=primaryjoin)
Отредактировано lightarhont (Апрель 16, 2015 18:00:40)
Офлайн