contains_eager на отношениях noload работает starange - PullRequest
1 голос
/ 07 августа 2020

DB

mysql> select * from comment;
+----+--------+---------+
| id | body   | post_id |
+----+--------+---------+
|  1 | first  |       1 |
|  2 | second |       1 |
|  3 | third  |       1 |
+----+--------+---------+
3 rows in set (0.00 sec)

mysql> select * from post;
+----+-------+
| id | title |
+----+-------+
|  1 | abc   |
+----+-------+

Модели

class Comment(Base):
    __tablename__ = 'comment'

    id = Column(Integer, primary_key=True, autoincrement=True)
    body = Column(Unicode(255))
    post_id = Column(ForeignKey('post.id'))


class Post(Base):
    __tablename__ = 'post'

    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(Unicode(255), nullable=False)

    comments = relationship('Comment', lazy='noload')

Запрос отношения comments, принадлежащего Post.

post = session.query(Post).join(
    Comment,
    Comment.post_id == Post.id,
).options(
    contains_eager(Post.comments)
).first()
print(post.comments)
print(post.comments[0].__dict__)

Результат

[<models.Comment object at 0x10fa70eb0>]
{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x10d151ee0>, 'id': 1, 'post_id': 1, 'body': 'first'}

Как вы знаете, я добавил опцию lazy='noload' для отношения комментариев.

Однако это не имеет никакого отношения с опцией contains_eager.

Но результат запроса возвращает только первые комментарии.

Почему он не возвращает все комментарии, связанные с post_id = 1?

Спасибо.

...