sqlalchemy必须存在不同的孩子

时间:2017-05-04 20:44:28

标签: python sqlalchemy flask-sqlalchemy

我正在尝试构建一个查询,该查询返回所有具有符合指定条件的子项的对象。诀窍是有多个互相排斥的标准,因此必须有多个孩子。我不确定如何表达这一点。

型号:

class Message(Base):
    __tablename__ = 'Message'


class MessageRecipient(Base):
    __tablename__ = 'MessageRecipient'

    recipient_id = Column(Integer, ForeignKey('User.uid'))
    message_id = Column(Integer, ForeignKey('Message.uid'))

    user = relationship('User', backref="messages_received")
    message = relationship('Message', backref="recipients")

我希望获取正在发送给定义的一组用户的所有消息。例如,我想要返回发送给用户12的所有邮件,但不会返回仅发送给用户1的邮件或仅发送给用户2的邮件。它必须已发送给两个用户!

我正在尝试如下查询:

    query = Message.query.filter(Message.recipients.any(MessageRecipient.recipient_id.in_([1,2])))

上述情况不起作用,因为in_是分离的。它确实返回了我想要的消息,但它也返回了我不想想要的消息。

有没有人知道我如何构建一个查询,要求Message MessageRecipients具有任意一组ID?

1 个答案:

答案 0 :(得分:0)

我通过迭代集合中的所有对象并使用exists()为每个对象创建一个新的子查询来解决这个问题。不确定这是否是最有效的方式,但它确实有效。

    for recipient in [1,2]:
        query = query.filter(MessageRecipient.query.filter(and_(MessageRecipient.recipient_id== recipient, 
                                                                MessageRecipient.message_id == Message.uid)).exists())