Найти - Пользователи
Полная версия: sqlalchemy проблема с примесями
Начало » Базы данных » sqlalchemy проблема с примесями
1 2 3
4kpt_III
bismigalis

Не должно работать
4kpt_III
Ну да. Как я и думал. Этот класс находится вне маппера…

P.S. Самое, что интересное, что ответ на Ваш вопрос я написал уже во четвертом посте Воду в ступе толчем и толчем. Зато себя заняли хоть как-то
lightarhont
4kpt_III
Я наконец-таки понял, что Вы хотите сделать. Самый простой вариант - использовать фиксированный префикс, как я написал выше. Второй вариант значительно хардкорнее. Теперь я его не рекомендую.

А вот тут подробнее…

У меня вретится в голове лишь установить сюда переменные:
@declared_attr
def users(cls):
return relationship(“Users”, uselist=False, primaryjoin=“Users.id == Blocks.user_id”)

Вместо “Users” и “Blocks” которые получали бы имя класса, но как это сделать я dontknow…
lightarhont
4kpt_III
Ну да. Как я и думал. Этот класс находится вне маппера…

P.S. Самое, что интересное, что ответ на Ваш вопрос я написал уже во четвертом посте Воду в ступе толчем и толчем. Зато себя заняли хоть как-то

да читать то умеем:
1. Называть все с одним префиксом и в @declared_attr формировать связь учитывая базовый префикс.

не понятно как это сделать. опыта то у меня с Python чуть более года. До этого только PHP.
4kpt_III
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):

Идея, думаю, ясна.
lightarhont
А что если добавить класс в число предков SUsers с новым значением “Users”?

Вот такой:
#CS - construction shemas
class CS:
    __cs__ = {'SUsers': 'User'}

Но делать это не в самом модуле схем, а в модуле моделей RBAC_USERS или COMMENTS_USERS?
Вроде как это можно сделать через метаклассы.

Тогда в схемах остаётся прописать лишь:

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__)

А затем уже наследовать class RBAC_USERS(SUsers, Base).

По идее должно работать… Как в Python добавить класс в число предков?
Как то вот так вот может?
http://habrahabr.ru/post/65625/
4kpt_III
Понимаете, что Вы делаете вызов моделей (для получения данных), которые имеют одинаковые названия. В этом проблема. А не в том, как правильно их подключить. Поэтому самым простым решением является сделать модели с разными именами, но с одними ссылками на таблицы БД. То, что Вы написали не только усложняет но еще и заставляет описывать допустимые согласования в каком-то отдельном классе. Путаете следы как профессиональный заяц-рысак.

P.S. Я же уже говорил, что в declared_attr в вашем случае нет cls там self в чистом виде.

P.S.S. Ну и так вообще-то никто не делает. Не для этого миксины нужны.
lightarhont
В общем решил так вопрос:

Где Base я ипортирую cs
def cs(cs):
    from testproject.models.shemas import CS
    setattr(CS, "__cs__", cs)

Затем вместе с моделями просто вызываю перед ними:
cs({'SUsers': ‘Users’})

свзяи срабатывают
@declared_attr
    def users(cls):
        return relationship(cls.__cs__['SUsers'], uselist=False, primaryjoin="Users.id == %s.user_id" % cls.__name__)

Возмлжная проблема это то что нужно прописывать каждый раз cs({'SUsers': ‘Users’, …})

Возможно лучше использовать метакласс, поскольку он автоматически сможет получать имя функции, но что то мне подсказывает, что тут не всё так просто там…
4kpt_III
Господи. Какой костыль. Импорт внутри функции вообще яд…

lightarhont
Возможно лучше использовать метакласс, поскольку он автоматически сможет получать имя функции, но что то мне подсказывает, что тут не всё так просто там…

Учитывая Ваши модели и то, что Вы творите, то метаклассы пока будут лишними
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)

но исправив не к чему не пришёл…
При добавлении новых моделей опять выходи ошибка связей. Что интересно я даже не знаю как помотреть сязь:
primaryjoin = “%s.id == %s.user_id” % (cls.__cs__, cls.__name__)
поскольку в лог ничего не попадает… Ошибка тоже такая-же…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB