sqlalchemy круговая зависимость - PullRequest
0 голосов
/ 14 января 2012

У меня есть определенные клиенты и адреса.

Клиент может содержать много адресов. Клиент будет иметь адрес доставки по умолчанию. У клиента будет адрес счета по умолчанию.

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. Эта страница была тем, с чего я начал и пытался расширить. ТИА

1 Ответ

0 голосов
/ 14 января 2012

Проблема была не в модели, а в том, как я добавлял две записи в сеанс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...