Sqlalchemy получить данные из отношений - PullRequest
2 голосов
/ 22 января 2020

У меня есть эти модели

class Post(Base):
    __tablename__ = 'posts'
    id = Column(Integer, primary_key=True)
    content = Column(Text)
    author = Column(Integer, ForeignKey('users.id'))
    to_topic = Column(Integer, ForeignKey('topics.id'))

    def __init__(self, content: str, author: int, to_topic: int) -> None:
        self.content = content
        self.author = author
        self.to_topic = to_topic

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True)
    username = Column(String(30))
    email = Column(String(40))
    password = Column(String(255))
    registred_at = Column(DateTime, default=datetime.datetime.now)
    last_logged_in = Column(DateTime)
    last_login_attempt = Column(DateTime)
    avatar = Column(Integer, ForeignKey('files.id'))
    role = Column(String(20))
    email_confirm = Column(Boolean, default=False)
    children_forum = relationship('Forum')
    children_topic = relationship('Topic')
    children_post = relationship('Post')

И я пытаюсь получить запрос, который будет содержать Post.content, Post.author.username, но как мне это сделать в сессиях?

Я попытался

 posts = db_session.query(Post, User).filter(
        Post.to_topic == topic_id).with_entities(Post.content, Post.author.username)

, но это не работает, потому что автор - просто целое число (id), поэтому я ожидаю, что мне нужно каким-то образом получить объект автора и опубликовать объект в одном запросе, но я не знаю как. В sql это было бы просто 2 запроса, но здесь я не знаю, как это делается.

1 Ответ

2 голосов
/ 22 января 2020
 query_results = db_session.query(Post, User).\
     join(User, Post.author == User.id).\
     filter(
         Post.to_topic == topic_id
     ).all()

Я никогда не использовал with_entities, но я знаю, что это даст вам список кортежей, где query_results[0] будет вашим Post экземпляром, а query_results[1] будет вашим User экземпляром.

РЕДАКТИРОВАТЬ: Я считаю, что вам не нужно включать бит Post.author == User.id, но это более разборчиво, если вы явно с вашими объединениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...