2013-06-22 9 views
5

फ्लास्क-स्क्लाक्लेमी example को कई रिश्तों को बनाने के तरीके के बारे में बताता है। यह दो अलग-अलग तालिकाओं के बीच किया जाता है।एक टेबल पर कई लोगों को बनाएं

क्या एक ही टेबल पर कई रिश्तों को बनाना संभव है? उदाहरण के लिए एक बहन की कई बहनें हो सकती हैं, जिनकी कई बहनें भी होती हैं। मैंने कोशिश की है:

girl_sister_map = db.Table('girl_sister_map', 
         db.Column('girl_id', 
           db.Integer, 
           db.ForeignKey('girl.id')), 
         db.Column('sister_id', 
           db.Integer, 
           db.ForeignKey('girl.id'))) 

class Girl(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String) 
    sisters = db.relationship('Girl', 
           secondary=girl_sister_map, 
           backref=db.backref('othersisters', lazy='dynamic')) 

लेकिन जब मैं एक लड़की मैं पाने के लिए एक बहन को जोड़ने का प्रयास:

sqlalchemy.exc.AmbiguousForeignKeysError: Could not determine join condition between parent/child tables on relationship Girl.sisters - there are multiple foreign key paths linking the tables via secondary table 'girl_sister_map'. Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference from the secondary table to each of the parent and child tables.

यह संभव है? मुझे यह कैसे करना चाहिए?

उत्तर

9

आप adjacency list कहलाए जाने की कोशिश कर रहे हैं। यह आपके पास विदेशी कुंजी के साथ एक टेबल है।

आपके विशिष्ट मामले में यह self referencial many to many relationship है।

यह एसक्लाक्लेमी में समर्थित है क्योंकि आप पिछले लिंक का पालन करके खोज करेंगे। डॉक्टर में कई उदाहरण हैं।

असल में, आपको primaryjoin और secondaryjoin तर्कों की आवश्यकता होगी ताकि आप यह सुनिश्चित कर सकें कि आप तालिका में कैसे शामिल होना चाहते हैं। सीधे डॉक्टर से:

Base = declarative_base() 

node_to_node = Table("node_to_node", Base.metadata, 
    Column("left_node_id", Integer, ForeignKey("node.id"), primary_key=True), 
    Column("right_node_id", Integer, ForeignKey("node.id"), primary_key=True) 
) 

class Node(Base): 
    __tablename__ = 'node' 
    id = Column(Integer, primary_key=True) 
    label = Column(String) 
    right_nodes = relationship("Node", 
         secondary=node_to_node, 
         primaryjoin=id==node_to_node.c.left_node_id, 
         secondaryjoin=id==node_to_node.c.right_node_id, 
         backref="left_nodes" 
    ) 
संबंधित मुद्दे