2015-06-02 9 views
5

मैं मुझे के जीवन के लिए बनाने के लिए कई संदर्भ को समझ नहीं सकता क्यों यह आत्म निर्देशात्मक कई-से-अनेक खुश नहीं होगा:स्वयं कई कुप्पी के SQLAlchemy

minor_contains = db.Table(
    'minor_contains', 
    db.Column('parent_id', db.Integer, db.ForeignKey('minors.id'), 
      primary_key=True), 
    db.Column('contains_id', db.Integer, db.ForeignKey('minors.id'), 
      primary_key=True)) 

class Minor(db.Model): 
    __tablename__ = 'minors' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String()) 
    ... 
    contains = db.relationship(
     "Minor", 
     secondary=minor_contains, 
     primaryjoin="id == minor_contains.c.parent_id", 
     secondaryjoin="id == minor_contains.c.contains_id", 
     backref="contained_by", 
     lazy='dynamic') 

मैं इसे कुछ दोबारा काम की कोशिश की है SQLAlchemy के लिए और Flask-SQLAlchemy के लिए मैंने जो उदाहरण देखा है, उनके आधार पर अलग-अलग तरीके हैं, लेकिन मैं लगातार समाप्त होता हूं जहां मुझे निम्न त्रुटि संदेश मिलता है या मैं कहीं अनंत लूप में समाप्त होता हूं।

ई ArgumentError: रिश्ते Minor.contains पर प्राथमिक जुड़ने की स्थिति 'minor_contains.parent_id =: parent_id_1' के लिए स्थानीय रूप से मैप किए गए विदेशी कुंजी कॉलम से जुड़े किसी भी समान समानता अभिव्यक्ति का पता नहीं लगा सका। सुनिश्चित करें कि कॉलम को संदर्भित करना विदेशीकी या विदेशीके कॉन्स्ट्रेंस से जुड़ा हुआ है, या विदेशी() एनोटेशन के साथ जुड़ने की स्थिति में एनोटेट किया गया है। '==' के अलावा तुलना ऑपरेटर को अनुमति देने के लिए, रिश्ते को viewonly = True के रूप में चिह्नित किया जा सकता है।

अद्यतन

मैं वास्तव में त्रुटि संदेश को समझने के लिए है क्योंकि यह में शामिल होने तालिका से स्तंभ से पता चलता नाकाम रहने रहा हूँ अपने आप की तुलना में किया जा रहा है, जहां में शामिल होने पर हालत की तुलना में नाबालिगों तालिका के पी होना चाहिए जुड़ने की मेज में एफके के लिए।

मैं इसका एक संस्करण भी जोड़ूंगा जो हमेशा के लिए लटकता है। आप देखेंगे कि मैं पुनर्विक्रेता परिवर्तनीय नाम रहा हूं और इस तरह से इसे फिर से लिखना और उम्मीद कर रहा हूं कि अगर मैं इसमें एक नया स्टैब लेता हूं, तो मैं किसी भी तरह से दूसरी या पांचवीं बार समझदार हो जाऊंगा।

minor_contains = db.Table(
    'minor_contains', 
    db.Column('parent_minor_id', db.Integer, db.ForeignKey('minors.id'), 
      primary_key=True), 
    db.Column('contains_minor_id', db.Integer, db.ForeignKey('minors.id'), 
      primary_key=True)) 

class Minor(db.Model): 
    __tablename__ = 'minors' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String()) 
    ... 
    contains = db.relationship(
     "Minor", 
     secondary=minor_contains, 
     primaryjoin=id==minor_contains.c.parent_minor_id, 
     secondaryjoin=id==minor_contains.c.contains_minor_id, 
     backref=db.backref("minor_contains", lazy='dynamic')) 
+0

क्या आपने कभी इसे हल किया था? मुझे भी यही समस्या हो रही है। – Ominus

उत्तर

0

क्या आपने ऐसा करने की कोशिश की है?

minor_contains = db.Table(
    'minor_contains', 
    db.Column('parent_id', db.Integer, db.ForeignKey('minors.id'), 
     primary_key=True), 
    db.Column('contains_id', db.Integer, db.ForeignKey('minors.id'), 
     primary_key=True)) 

class Minor(db.Model): 
    __tablename__ = 'minors' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String()) 
    ... 
    contains = db.relationship(
     "Minor", 
     secondary=minor_contains, 
     primaryjoin="id == minor_contains.c.parent_id", 
     secondaryjoin="id == minor_contains.c.contains_id", 
     backref=db.backref('minor_contains', lazy='dynamic'), 
     lazy='dynamic') 
+0

ओप ने लिखा क्या उससे अलग है? – davidism

+0

दूसरी अंतिम लाइन? –

+0

हाँ, लेकिन आपने जो कुछ किया वह बैकरेफ़ गतिशील था, जिसकी समस्या पर कोई असर नहीं पड़ा। – davidism

1

मुझे लगता है कि शामिल स्थितियों में मॉडल नाम निर्दिष्ट करना आवश्यक है।

contains = db.relationship(
    "Minor", 
    secondary=minor_contains, 
    primaryjoin="Minor.id == minor_contains.c.parent_id", 
    secondaryjoin="Minor.id == minor_contains.c.contains_id", 
    backref=db.backref('minor_contains', lazy='dynamic'), 
    lazy='dynamic') 

मेरे पास एक ही समस्या थी और इससे समस्या ठीक हुई। मुझे यहां एक उपयोगी उत्तर मिला: link

+0

हाइपरलिंक बहुत उपयोगी था ... विशेष रूप से - "कई से अधिक आत्म-संदर्भित संबंधों को परिभाषित करते समय, मैंने पाया कि प्राथमिक कुंजी स्तंभ को तालिका में ही परिभाषित किया जाना चाहिए। इसे मॉडल आधार या परिभाषित नहीं किया जा सकता है मिश्रित वर्ग जिसमें से यह इकाई व्युत्पन्न होती है। " यह अकेले मेरी समस्या हल हो गया। – Krejko

संबंधित मुद्दे