2010-08-23 2 views
0

Je suis nouveau sur python (sqlalchemy), et j'apprends à construire un site web avec pylons et sqlalchemy.Comment déclarer un-à-plusieurs s'il y a 2 champs pour une même clé étrangère

J'ai un problème lorsque je déclare la relation entre les modèles. Je l'ai essayé plusieurs heures, mais j'ai échoué. Mais je pense que cela devrait être une question fondamentale.

J'ai deux classes: Utilisateur et Article, l'utilisateur peut créer des articles, et modifié l'article des autres personnes (comme wiki). Ainsi, un utilisateur a créé des articles et des articles édités.

class Article(Base): 
    __tablename__ = 'articles' 

    id = Column(Integer, primary_key=True) 
    title = ... 

    user_id = Column(Integer, ForeignKey('users.id')) 
    editor_id = Column(Integer, ForeignKey('users.id')) 

    # relations 
    user = relationship('User', backref='articles') # -> has error 


class User(Base): 
    __tablename__ = "users" 

    id = Column(Integer, primary_key=True) 
    name = Column(String(20)) 

    def __init__(self): 
     pass 

Mais il y a une erreur affichée:

InvalidRequestError: One or more mappers failed to compile. Exception was probably suppressed within a hasattr() call. Message was: Could not determine join condition between parent/child tables on relationship Article.user. Specify a 'primaryjoin' expression. If this is a many-to-many relationship, 'secondaryjoin' is needed as well. 

J'ai essayé d'ajouter primaryjoin à la ligne (« erreur a »), mais ne sais pas ce qu'elle devrait être. J'ai essayé quelques codes, mais aucun ne fonctionne.

Merci d'avance!

+0

Pouvez-vous également fournir votre classe d'utilisateur? Ou est-ce factice dans le code? –

+0

La classe User est mise à jour et j'ai supprimé certains champs inutilisés. Il n'y a pas de déclaration de relation dans l'utilisateur, seulement quelques colonnes. Merci, Daniel – Freewind

Répondre

2

Ah, c'est évident.

La classe d'articles comporte deux références à User, user_id et editor_id, ainsi SQLA ne sait pas lequel d'entre eux utiliser pour votre relation. Il suffit d'utiliser explicitement primaryjoin:

user = relation('User', backref='articles', primaryjoin="Article.user_id==User.id") 
+0

Merci beaucoup, Daniel. Ça fonctionne maintenant :) – Freewind

Questions connexes