多个文件-关系



我在两个独立的文件中有我的两个类,customer和address。地址将在其他地方使用,例如供应商有地址。customer类需要通过三种方式引用地址类。客户有一个默认的收货地址(一对一)、一个默认账单地址(一比一)和一个多个地址的列表,如果不需要默认地址,可以选择这些地址。ar.py文件中的客户类和地址类位于global.py文件。

一对一的列表可以工作,但一对多的列表我不知道如何使它与两个不同文件中的类一起工作。没有循环问题。

感谢您提供的任何见解。。。

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

您可以使用字符串而不是实例来创建模型。例如

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

SQLAlchemy将处理将这些转换为对象。

一对多通常通过指向客户的fkey地址来处理。然而,如果您将地址用于多种目的,则这将不会很好地工作。如果您希望数据库中的所有地址都存储在一个表中,那么我建议在每个表和地址之间添加链接表。例如,customer_addresses对地址和客户具有fkeys。另一种选择是为customer_addresss和vendor_addresss制作一个单独的表。如果你想这样做,最好的方法是创建一个AddressMixin,它可以应用于不同的对象:

class AddressMixin(object):
    @declared_attr
    def street(cls):
        return Column(Text, ...)
class CustomerAddress(Base, AddressMixin):
    __tablename__ = 'customer_addresses'
    id = ...

最新更新