2010-08-12 11 views
35

के साथ एक-से-एक संबंध घोषणात्मक का उपयोग करते हुए स्क्लाक्लेमी में एक-से-एक संबंध बनाने का सबसे अच्छा तरीका क्या है?sqlalchemy: घोषणात्मक

मैं दो टेबल, foo और bar है, और मुझे foo.bar_idbar लिंक करना चाहते हैं। पकड़ यह है कि यह एक-तरफा एक-एक संबंध है। bar को foo के बारे में कुछ भी पता नहीं होना चाहिए। प्रत्येक foo के लिए, एक और केवल एक bar होगा।

myfoo.bar.whatever = 5 

सबसे अच्छा तरीका है कथात्मक का उपयोग कर यह पूरा करने के क्या है:

आदर्श रूप में, एक foo चयन करने के बाद, मैं कुछ इस तरह कर सकता है?

उत्तर

28

आप एक सच्चे एक-से-एक संबंध चाहते हैं, आप भी अपने रिश्ते परिभाषा "uselist = गलत" का उपयोग करने के लिए है।

bar_id = Column(Integer, ForeignKey(Bar.id)) 
bar = relationship(Bar, uselist=False) 
+6

यह बिल्कुल सही नहीं है, क्योंकि 'uselist'' कीवर्ड का कोई प्रभाव नहीं पड़ता है यदि जुड़ने का एफके संबंध परिभाषा की तुलना में एक ही कक्षा में है। सही समाधान के लिए [chadwick.boulay का जवाब] (http://stackoverflow.com/a/9611874/851737) देखें। – schlamar

2

यह पता चला है कि यह वास्तव में काफी आसान है। अपने फू मॉडल में:

bar_id = Column(Integer, ForeignKey(Bar.id)) 
bar = relationship(Bar) 
81

0,7 explains this nicely के लिए दस्तावेज़:

class Parent(Base): 
    __tablename__ = 'parent' 
    id = Column(Integer, primary_key=True) 
    child = relationship("Child", uselist=False, backref="parent") 

class Child(Base): 
    __tablename__ = 'child' 
    id = Column(Integer, primary_key=True) 
    parent_id = Column(Integer, ForeignKey('parent.id')) 

या

class Parent(Base): 
    __tablename__ = 'parent' 
    id = Column(Integer, primary_key=True) 
    child_id = Column(Integer, ForeignKey('child.id')) 
    child = relationship("Child", backref=backref("parent", uselist=False)) 

class Child(Base): 
    __tablename__ = 'child' 
    id = Column(Integer, primary_key=True) 
3

मुझे लगता है कि अगर यह एक सही मायने में एक के बाद एक रिश्ते को हम विदेशी कुंजी के लिए एक विशिष्टता बाधा जोड़ने चाहिए है तो एक और माता-पिता के पास अन्य माता-पिता नहीं हो सकते !! इस तरह:

class Parent(Base): 
    __tablename__ = 'parent' 
    id = Column(Integer, primary_key=True) 
    child_id = Column(Integer, ForeignKey('child.id'), unique=True) 
    child = relationship("Child", backref=backref("parent", uselist=False)) 

class Child(Base): 
    __tablename__ = 'child' 
    id = Column(Integer, primary_key=True) 
संबंधित मुद्दे