2012-01-07 83 views
1

我有兩個單獨的文件,客戶和地址我的兩個類。地址將在其他地方使用,例如供應商具有地址。客戶類需要通過三種方式引用地址類。客戶有一個默認發貨地址(一對一)缺省帳單地址(一對一)和他的多個地址列表,如果不需要默認值,可以選擇。 ar.py文件和地址類中的客戶類位於global.py文件中。sqlalchemy - 多個文件 - 關係

一對一的工作,但一對多列表我無法弄清楚如何使它與兩個不同的文件中的類一起工作。無循環問題。

感謝您能提供任何見解......

globals.py 
from erp.model import DeclarativeBase, metadata, DBSession 

class Address(DeclarativeBase): 
    __tablename__ = 'addresses' 
    address_id = Column(Integer,primary_key=True) 
    name = Column(Unicode(100)) 
    address_one = Column(Unicode(100)) 
    address_two = Column(Unicode(100)) 
    address_three = Column(Unicode(100)) 
    city = Column(Unicode(100)) 
    state = Column(Unicode(100)) 
    zip_code = Column(Unicode(100)) 
    phone = Column(Unicode(100)) 
    fax = Column(Unicode(100)) 
    contact = Column(Unicode(100)) 

ar.py ... 
from erp.model.globals import Address 

class Customer(DeclarativeBase): 
    __tablename__ = 'customers' 
    customer_id = Column(Integer, primary_key=True) 
    customer_name = Column(Unicode(100)) 
    discount = Column(Float) 
    #bill_to_id = Column(Integer, ForeignKey('addresses.address_id')) 
    #bill_to = relation(Address,primaryjoin=bill_to_id==Address.address_id,uselist=False) 
    ship_to_id = Column(Integer, ForeignKey('addresses.address_id')) 
    ship_to = relation(Address,primaryjoin=ship_to_id==Address.address_id,uselist=False) 
    locations = relation(Address,backref="customer",primaryjoin='customers.customer_id'=='addresses.customer_id') 

我可以使這項工作就好了,如果我在一個文件中所擁有的一切然而,這與上一個有一堆東西的項目佈局複雜文件或者更糟糕的是在ar文件和供應商文件中複製相同種類的地址佈局。

再次感謝您的幫助! Paul

回答

2

您可以使用字符串而不是實例創建模型。例如,

ship_to = relation('Address', ...) 

SQLAlchemy將處理將它們轉換爲對象。

一對多通常通過指向客戶的地址上的fkey進行處理。但是,如果您將這些地址用於多種用途,這種方式將無法正常工作。如果你希望數據庫中的所有地址都存儲在一個表中,那麼我建議在每個表和地址之間添加鏈接表。例如,customer_addresses將有地址和客戶的密碼。另一種選擇是爲customer_addresses和vendor_addresses創建一個單獨的表。如果你想這樣做最好的辦法是創建一個AddressMixin,你可以應用於不同的對象:

class AddressMixin(object): 
    @declared_attr 
    def street(cls): 
     return Column(Text, ...) 

class CustomerAddress(Base, AddressMixin): 
    __tablename__ = 'customer_addresses' 
    id = ... 
+0

太棒了。然而,這很有效(除非我錯了),我仍然需要在地址類上聲明一對多。因此,這個類將開始具有customer_id .. customer = relation ...,然後再有兩個供應商的條目,等等,以便需要使用這個類。更糟糕的是,隨着應用程序的增長,我希望使用這樣的地址,我必須修改地址。有沒有辦法在客戶課上做到這一切? – Ominus 2012-01-07 04:10:21

+0

看看關係的'backref'參數,你可以在任何一個類上定義關係,它將通過backref應用到另一端。 – 2012-01-07 04:13:11

+0

我明白了。爲了保持代碼清潔,我會更好地擁有一個繼承地址的customer_address類,並且只添加customer_id foreighnkey字段?這是我猜想的一個害蟲實踐問題。 – Ominus 2012-01-07 04:14:40