2012-01-13 180 views
0

我有一個定義的客戶和地址。sqlalchemy循環依賴

客戶可以包含許多地址。 客戶將擁有默認發貨地址。 客戶將有一個默認賬單來解決。

customer.locations應該給我一個客戶所有地址的列表。

customer.bill_to/ship_to應該給我一個地址。

class Customer(DeclarativeBase): 
    __tablename__ = 'customers' 
    customer_id = Column(Integer, primary_key=True,autoincrement=True) 
    customer_code = Column(Unicode(15),unique=True) 
    customer_name = Column(Unicode(100)) 
    abc_id = Column(Integer,ForeignKey('customer_abc.abc_id')) 
    abc = relation(CustomerABC,backref=backref('customers',order_by=customer_code)) 
    status_id = Column(Integer,ForeignKey('status.status_id')) 
    status = relation(Status,backref=backref('customers',order_by=customer_code)) 
    discount = Column(Float) 
    website = Column(Unicode(100)) 

    bill_to_id = Column(Integer, ForeignKey('addresses.address_id')) 
    ship_to_id = Column(Integer, ForeignKey('addresses.address_id')) 


    bill_to = relation('CustomerAddress', 
         primaryjoin='CustomerAddress.address_id==Customer.bill_to_id') 
    ship_to = relation('CustomerAddress', 
         primaryjoin='CustomerAddress.address_id==Customer.bill_to_id') 

    def __init__(self,code,name,status='A',abc='N'): 
     self.customer_code = code 
     self.customer_name = name 
     status = DBSession.query(Status).filter(Status.status_code==status).first() 
     if status: 
      self.status = status 
     abc = DBSession.query(CustomerABC).filter(CustomerABC.abc==abc).first() 
     if abc: 
      self.abc = abc 

class CustomerAddress(DeclarativeBase): 
    __tablename__ = 'addresses' 
    address_id = Column(Integer,primary_key=True,autoincrement=True) 
    address_code = Column(Unicode(10)) 
    customer_id = Column(Integer,ForeignKey('customers.customer_id')) 
    customer = relation('Customer', 
         backref=backref('locations'), 
         primaryjoin='Customer.customer_id == CustomerAddress.customer_id') 
    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)) 
    country = Column(Unicode(2)) 
    contact = Column(Unicode(100)) 
    @property 
    def formatted_address(self): 
     address = "%s<br/>%s<br/>" %(self.name,self.address_one) 
     if self.address_two: 
      address += "%s<br/>" %self.address_two 
     if self.address_three: 
      address += "%s<br/>" %self.address_three 
     address += "%s, %s %s" %(self.city,self.state,self.zip_code) 
     return address 

但是它拋出...

sqlalchemy.exc.CircularDependencyError: Circular dependency detected: 

我只是想學的SQLAlchemy的來龍去脈。 page是我開始嘗試擴展的。 TIA

回答

0

問題不在模型中,而在於我如何將兩條記錄添加到會話中。