2010-11-15 73 views
1

新手問題。使用聲明式風格的主塔1 + SQLA。 Python新手。主塔+ SQLA:一對一關係

我有一個稱爲實體的「主」類,「子」類必須屬於它們纔是有效的。我與主類的鏈接位於子對象級別。我的問題是,我似乎無法弄清楚如何創建一個子對象並創建一個主對象以及創建對象之間的鏈接。我利用關係來進行鏈接。

因此我想創建如下一個鏈路一個ONO: 實體1 - 客戶端1 實體2 - 客戶端2 實體3 - 生產者1 實體4 - 生產者2 等

的代碼可能更好地解釋。

class Entity(Base): 
    __tablename__ = "entities" 
    # Primary Key 
    entity_id = Column(Integer, primary_key=True) 
    # Data Fields 
    name = Column(Unicode(255), nullable=False) 
    def __init__(self, name, description): 
     self.name = name 
    def __unicode__(self): 
     return self.name 
    __str__ = __unicode__ 

class Client(Base): 
    __tablename__ = "clients" 
    client_id = Column(Integer, primary_key=True) 
    # Data fields 
    name = Column(UnicodeText(255), nullable=False, unique=True) 
    # Entity Link 
    entity_id = Column(Integer, ForeignKey('entities.entity_id')) 
    # Mapper 
    entity = relation('Entity') 
    def __init__(self, name): 
     self.name = name 
    def __unicode__(self): 
     return self.name 
    __str__ = __unicode__ 

在控制器中,我嘗試創建一個新的客戶端並追加一個實體,這個實體失敗了。請在下面編碼。

  client_entity = model.Entity(name=client_name, description=client_name + " added") 
      client = model.Client(name=client_name) 
      client.entity.append(client_entity) 
      Session.add(client) 
      Session.commit() 

現在根據我這應該是可能的,我希望有人可以幫助,因爲我在我的智慧結束。

回答

0

這有意義嗎?

class Entity(Base): 
    __tablename__ = "entities" 
    # Primary Key 
    entity_id = Column(Integer, primary_key=True) 
    # Data Fields 
    name  = Column(Unicode(255), nullable=False) 

    def __init__(self, name, description): 
     self.name   = name 

    def __unicode__(self): 
     return self.name 
    __str__ = __unicode__ 

class Client(Base): 
    __tablename__ = "clients" 
    client_id = Column(Integer, primary_key=True) 
    name  = Column(UnicodeText()) 
    entity_id = Column(Integer, ForeignKey('entities.entity_id')) 
    # Mapper 
    entity = relation('Entity', uselist=False, backref='clients') 

    def __init__(self, name): 
     self.name = name 

    def __unicode__(self): 
     return self.name 
    __str__ = __unicode__ 



client_name="ClientName" 
entitiy_name="EntityName" 

client = Client(name=client_name) 
client.entity=Entity(name=entitiy_name, description=entitiy_name + " added") 

我認爲"uselist=False"是有用的,如果您使用OneToOne。

+0

它確實有道理,我會試一試。 – 2010-11-23 19:14:54