sqlalchemy hybrid_property, объединяющий значения из отношения - PullRequest
1 голос
/ 15 марта 2020

У меня есть относительно простая модель, в которой я хочу объединить данные из 2 таблиц в качестве hybrid_property. Что-то вроде следующего, где global_id будет, например, fr-123 или de-456.

class Product(Base):
    product_id = Column(Integer, primary_key=True)
    country_id = Column(Integer, ForeignKey('country.id'), nullable=False)
    country = relationship('Role', backref='product')

    @hybrid_property
    def global_id(self):
        return self.country.tld + "-" + self.product_id

Это хорошо работает для простых запросов, но когда я пытаюсь выполнить поиск с использованием LIKE, я получаю ошибка:

AttributeError: Ни объект «InstrumentedAttribute», ни объект «Comparator», связанный с Product.country, не имеют атрибута «tld»

Я считаю, что мне нужно создать expression метод, который справится с этим - но я не уверен, какую форму нужно принять этому выражению!

Также будет иметь значение, если country.tld также будет hybrid_property?

1 Ответ

1 голос
/ 17 марта 2020

Вам нужно объединить строки в выражении, в PostgreSQL вы можете сделать это с оператором ||:

from sqlalchemy.sql import select

class Country(Base):
    __tablename__ = 'country'
    id = Column(Integer, primary_key=True)
    tld = Column(String)

class Product(Base):
    __tablename__ = 'product'
    product_id = Column(Integer, primary_key=True)
    country_id = Column(Integer, ForeignKey('country.id'), nullable=False)
    country = relationship('Country', backref='product')

    @hybrid_property
    def global_id(self):
        return self.country.tld + "-" + str(self.product_id)

    @global_id.expression
    def global_id(cls):
        return select([Country.tld.op('||')('-').op('||')(cls.product_id)]).\
               where(Country.id==cls.country_id).label('global_id')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...