2013-07-24 5 views
0

j'ai un simple système de messagerie avec Conversation, les objets utilisateur et un message défini comme ceci:sqlalchemy objets connexes distincts

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String) 

class Conversation(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 

class Message(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    text = db.Column(db.String) 
    author = db.relationship('User') 
    conversation = db.relationship('Conversation', backref=db.backref('messages', lazy='dynamic')) 

Je voudrais obtenir tous les utilisateurs qui participent à une conversation.

Il est facile pour moi dans SQL:

select distinct users.* 
from users inner join messages on messages.author_id = users.id 
where messages.conversation_id = 1; 

Mais je ne peux pas comprendre comment le faire avec la syntaxe de SQLAlchemy donc je reviens des objets et pas seulement les champs. Idéalement, je voudrais l'implémenter en tant que méthode get_authors sur Conversation.

Répondre

3
session.query(User).distinct().\ 
    join(Message, Message.author_id == User.id).\ 
    filter(Message.conversation_id == 1) 
+0

Merci. La condition de jointure n'est-elle pas supposée être générée automatiquement à partir de la relation entre Message et Conversation? Pourquoi ai-je besoin de le spécifier explicitement? – gooli

+0

De plus, il est possible d'utiliser conversation.messages dans la requête et d'éviter explicit_ conversation_id == 1? – gooli

Questions connexes