2013-02-26 3 views
6

Sto lavorando su un piccolo progetto in cui sto usando Flask-SqlAlchemy per implementare una relazione di elenchi di adiacenze. Ho un modello (tabella) che ha un attributo per db.Relationship() che fa riferimento alla colonna parent_id della stessa tabella.Elenco di adiacenza di Flask-SqlAlchemy Rapporto backfref error inaspettato

Ecco il codice seguente (parziale):

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]) 

Quando provo ad aggiungere una cartella figlio a una cartella principale utilizzando l'attributo backref sul bambino in Python Shell come ad esempio il seguente codice (parziale):

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

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

Tuttavia, ottengo i seguenti erros dopo provo che nella shell Python:

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

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

Ho letto i documenti SqlAlchemy per capire una soluzione e hanno una sintassi simile per le relazioni dell'elenco di adiacenze. Ha un esempio simile ma non mostra come si possa aggiungere un nodo genitore a un nodo figlio come stavo provando nella shell. La ragione per aggiungere il nodo genitore nella proprietà backref del figlio è che funzioni con relazioni uno-a-molti. Qualsiasi aiuto nel trovare il problema con il codice sarebbe molto apprezzato ... Non esitate a suggerire soluzioni alternative.

Grazie!

risposta

5

Configurare la relazione in modo errato. Si prega di fare questo:

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

o

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

Van, grazie per fornire il frammento e sottolineando il problema. Ho appena configurato la relazione nel modo in cui hai appena mostrato e indovina cosa, funziona esattamente come me l'aspettavo! Grazie mille ... Apprezzo davvero la pronta assistenza. – shafayet