SqlAlchemy - фильтрация по полю, определенному как ForeignKey - PullRequest
9 голосов
/ 13 февраля 2011

Я пытаюсь получить экземпляры класса, отфильтрованные по полю, являющемуся внешним ключом, но когда я пытаюсь это сделать, я всегда получаю все записи в базе данных, а не те, которые соответствуют критерию.

Допустим, у меня есть пара классов, использующих декларативную базу в простых отношениях N: 1. У меня есть что смоделировано как:

#!/usr/bin/python2.6
class ContainerClass(declarativeBase):
     __tablename__ = "container_classes"
     _id = Column("id", Integer, primary_key=True)
     id = sqlalchemy.orm.synonym('_id', descriptor=property(getId, setId))


class WhateverClass(declarativeBase):
     __tablename__ = "whatever_classes"

     _id = Column("id", Integer, primary_key=True)
     _total = Column("total", Integer)
     _containerClassId = Column("container_class_id", Integer, ForeignKey("other_classes.id"))

     _containerClass = relationship("ContainerClass", uselist=False)

     id = sqlalchemy.orm.synonym('_id', descriptor=property(getId, setId))
     total = sqlalchemy.orm.synonym('_total', descriptor=property(getTotal, setTotal))
     containerClassId = sqlalchemy.orm.synonym('_containerClassId', decriptor=property(getContainerClassId, setContainerClassId))
     containerClass = sqlalchemy.orm.synonym('_containerClass', descriptor=property(getContainerClass setContainerClass))

Экземпляр «WhwhatClass» может принадлежать одному экземпляру «ContainerClass» (а каждый «ContainerClass» может иметь несколько экземпляров «WheverClass»). Отношения, кажется, работают нормально. Если я добавлю новый «WhwhatClass» в «ContainerClass», whatClass.containerClassId правильно получит значение класса ContainerClass, к которому он принадлежит.

Но, скажем, мне нужно получить список экземпляров «WheverClass», которые принадлежат «ContainerClass», чей id == 5.

Если я попытаюсь сделать:

from myClasses import WhateverClass
session.query(WhateverClass.WhateverClass).filter(WhateverClass.WhateverClass.containerClass.id == 5).all()

Я получаю все экземпляры WhwhatClass, которые хранятся в базе данных, а не только те, которые связаны с ContainerClass с id == 5

Но если я сделаю session.query (WhwhatClass.WhwhatClass) .filter (total <= 100) .all () </em> Я правильно получу экземпляры WheverClass, чье «общее» поле <= 100. </p> Я довольно новичок в sqlalchemy ... Должен ли я использовать объединенный запрос или что-то в этом роде? Я знаю, что это не может быть сложно, но я не смог найти подходящего решения. Я пробовал объединения, союзы ... Но (очевидно) я делаю что-то не так.

Я использую SqlAlchemy 0.6.6 и Python 2.6 (на всякий случай, если это актуально)

Заранее спасибо!

1 Ответ

15 голосов
/ 13 февраля 2011

Для простого запроса вы можете просто запросить напрямую:

session.query(WhateverClass).filter(WhateverClass._containerClassId == 5).all()

Для более сложных отношений вам необходимо объединение:

session.query(WhateverClass).join(ContainerClass).filter(ContainerClass.id == 5).all()
...