2013-02-26 12 views
6

Ich arbeite an einem kleinen Projekt, in dem ich Flask-SqlAlchemy verwende, um eine Adjazenzlistenbeziehung zu implementieren. Ich habe ein Modell (Tabelle), das ein Attribut für db.Relationship() hat, das auf die Spalte parent_id derselben Tabelle verweist. HierFlask-SqlAlchemy Adjazenzliste Beziehung backfref unerwarteter Fehler

ist der folgende Code (teilweise):

class Node(db.Model): 
    id = db.Column(db.Integer, primary_key = True) 
    title = db.Column(db.String(80)) 
    folder_id = db.Column(db.Integer, db.ForeignKey('node.id')) 

    children = db.relationship('Node', backref = 'parent', remote_side=[id]) 

Wenn ich versuche, einen untergeordneten Ordner zu einem übergeordneten Ordner mit dem backref Attribute auf dem Kind in dem Python-Shell wie der folgenden Code hinzufügen (Teil):

parentNode = Node('title1') 
db.session.add(parent) 
db.session.commit() 

childNode = Node('title2') 
child.parent = parentNode 

, jedoch bekomme ich folgende erros nachdem ich versuchen, dass in der Python-Shell:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 

TypeError: Incompatible collection type: Node is not list-like 

Ich habe die SqlAlchemy Dokumente gelesen, um eine Lösung zu finden, und sie haben ähnliche Syntax für Adjazenzliste Beziehungen. Es hat ein ähnliches Beispiel, zeigt aber nicht, wie man einem Kindknoten einen Elternknoten hinzufügen kann, so wie ich es in der Shell versucht habe. Der Grund für das Hinzufügen des Parent-Knotens zur Backref-Eigenschaft des Child-Objekts ist, dass es mit Eins-zu-Viele-Beziehungen arbeitet. Jede Hilfe beim Finden des Problems mit dem Code würde sehr geschätzt werden ... Bitte zögern Sie nicht, alternative Lösungen vorzuschlagen.

Danke!

Antwort

5

Sie konfigurieren die Beziehung falsch. Bitte tun Sie dies ein:

from sqlalchemy.orm import backref 
class Node(db.Model): 
    # ... 
    children = db.relationship('Node', backref=backref('parent', remote_side=[id])) 

oder

class Node(db.Model): 
    # ... 
    parent = db.relationship("Node", backref='children', remote_side=[id]) 
+0

Van, vielen Dank für das Snippet die Bereitstellung und das Problem hingewiesen. Ich habe die Beziehung so konfiguriert, wie du es gerade gezeigt hast und rate mal, es funktioniert genau so, wie ich es erwartet habe! Vielen Dank ... Ich schätze die schnelle Hilfe sehr. – shafayet