2010-08-12 46 views
35

Cách tốt nhất để tạo mối quan hệ một-một trong SQLAlchemy bằng khai báo là gì?sqlalchemy: mối quan hệ một-một với tuyên bố

Tôi có hai bảng, foobar và tôi muốn foo.bar_id để liên kết đến bar. Việc nắm bắt được rằng đây là mối quan hệ một chiều một chiều. bar không được biết gì về số foo. Đối với mỗi foo, sẽ có một và chỉ một bar.

Lý tưởng nhất, sau khi chọn một foo, tôi có thể làm một cái gì đó như thế này:

myfoo.bar.whatever = 5 

cách tốt nhất để thực hiện điều này bằng tường thuật là gì?

Trả lời

28

Nếu bạn muốn có mối quan hệ trực tiếp, bạn cũng phải sử dụng "uselist = False" trong định nghĩa mối quan hệ của mình.

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

Điều này không chính xác, vì từ khóa 'uselist'' không có tác động nếu FK của tham gia ở cùng một lớp so với định nghĩa mối quan hệ. Xem [câu trả lời của chadwick.boulay] (http://stackoverflow.com/a/9611874/851737) để có giải pháp đúng. – schlamar

2

Hóa ra điều này thực sự khá dễ dàng. Trong mô hình Foo của bạn:

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

Các tài liệu cho 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')) 

HOẶC

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

Tôi nghĩ rằng nếu nó là một thực sự 00:59 mối quan hệ chúng ta nên thêm một hạn chế tính độc đáo cho chính nước ngoài rất khác cha mẹ không thể có con cha mẹ khác !! Như thế này:

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) 
Các vấn đề liên quan