SQLAlchemy один-ко-многим запрос - PullRequest
0 голосов
/ 31 мая 2018

Я не понимаю, как сделать запрос.У меня есть следующее объявление

class GrandParent(Base):
    __tablename__ = "grandparent"
    id = Column(Integer, primary_key=True)
    name = Column(String(16))
    # One-to-one relationship
    parent_id = Column(Integer, ForeignKey('parent.id'))
    parent = relationship("Parent", backref=backref("grandparent", uselist=False))

    def __init__(self, name):
        self.name = name


class Parent(Base):
    __tablename__ = "parent"
    id = Column(Integer, primary_key=True)
    name = Column(String(16))
    # One-to-many relationship
    children = relationship("Child", backref="parent")

    def __init__(self, name):
        self.name = name


class Child(Base):
    __tablename__ = "child"
    id = Column(Integer, primary_key=True)
    name = Column(String(16))
    index = Column(Integer)
    parent_id = Column(Integer, ForeignKey('parent.id'))

    def __init__(self, name, idx):
        self.name = name
        self.index = idx

    def __repr__(self):
        return self.name

Что я хотел бы сделать, это запросить объект Child, зная его index и GrandParent.id.Я знаю, что этот запрос не работает, но только для иллюстрации того, что я ищу:

c = session.query(Child).filter(Child.parent.grandparent.id == 2 and Child.index == 3).first()

AttributeError: Ни у объекта «InstrumentedAttribute», ни у объекта «Comparator», связанного с Child.parent, нет атрибута'grandparent'

Однако это работает:

grandparent = GrandParent('dad')
grandparent.parent = Parent('bob')
grandparent.parent.children.append(Child('alice', 1))
grandparent.parent.children.append(Child('jo', 2))
grandparent.parent.children.append(Child('blo', 3))
foo = Child('foo', 4)
grandparent.parent.children.append(foo)
session.add(grandparent)
print(foo.grandparent.parent.id)

1 Ответ

0 голосов
/ 31 мая 2018

Наконец-то найдено решение juste после публикации.

См. doc для справки

c = session.query(Child).\
        filter(Child.parent.has(Parent.grandparent.has(GrandParent.id == 2))).\
        filter(Child.index == 2).first()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...