2017-04-03 8 views
0

Ich bin ziemlich neu in Python und Programmierung im Allgemeinen. Ich könnte Hilfe bei der Logik gebrauchen.Flask SQLAlchemy Foreign Key Abfrage

Ich habe 3 Tabellen, Benutzer, Beiträge, Kommentare. Tabellenkommentare haben eine Spalte "user_id", die einen Foreign_Key für die Benutzerspalte "id" hat. Auch als post_id mit FK nach post_id.

comments.user_id = users.id & & comments_post_id = posts.id

Um einen bestimmten Beitrag Abfrage Ich verwende:

post = Posts.query.filter_by(id=post_id).first_or_404() 

die Kommentare Zur Abfrage Ich verwende:

comments = Comments.query.filter_by(post_id=post_id).order_by(Comments.time.desc()).all() 

Ich möchte den Benutzernamen aus der Tabelle users bekommen, wo die Kommentare.user_id .... Dies ist, wo meine Logik verschlüsselt wird.

Mit dem FK kann ich direkt auf Users.username verweisen? Oder bildet der FK nur eine Beziehung ab, damit ich die Abfrage ausführen kann. Wobei comments.user_id = Users.id .... Benutzernamen und alles bekommen. Ich fühle, dass ich das ziemlich ineffizient mache.

würde Ich mag comment.user_id ersetzen mit „users.username wo comment.user_id = Benutzer-ID“

{% if comments %} 
    {% for comment in comments %} 
    {{ comment.user_id }} 
    {{ comment.time }} 
    {{ comment.comment }} 
    {% endfor %} 
{% endif %} 

Ich denke, was ich tun muss ich eine neue Spalte in den Kommentaren machen, comments.user_username & geben Sie einen FK von users.username. Ich bekomme immer einen 150 Fehler und die Spalten sind identisch. Gleiche Sortierung, Datentyp und Länge.

+0

Normalerweise würden Sie [JOIN] (https://en.wikipedia.org/wiki/Join_ (SQL)) die Benutzertabelle zu Ihrem Kommentar hinzufügen, um diese Daten ebenfalls abzurufen. SQLAlchemy [relationships] (http://docs.sqlalchemy.org/en/latest/orm/relationships.html) stellt die ORM-Seite bereit und kann dazu veranlasst werden, die Daten mit Joins zu laden. Wenn Sie beispielsweise eine Beziehung zwischen * Users * und * Comments * konfigurieren möchten, können Sie ['jointedload (Comments.user)'] (http://docs.sqlalchemy.org/en/latest/orm/loading_relationships) verwenden .html # sqlalchemy.orm.joinedload) usw. –

+0

Ausgezeichnet, Sie waren eine große Hilfe. Vielen Dank! –

Antwort

0

können Sie ein Attribut festlegen, welche Art von relationship SQLAlchemy ist wie folgt:

class Comment(db.Model): 
    id = db.Column(db.Integer(), primary_key=1) 
    content = db.Column(db.Text(), nullable=0) 
    create_user_id = db.Column(db.Integer(), db.ForeignKey("user.id")) 
    create_user = db.relationship("User", foreign_keys=create_user_id) 
    post_id = dn.Column(db.Integer(), db.ForeignKey("post.id")) 

Sie comment.create_user.username in der Vorlagendatei schreiben kann.