У меня есть два класса в двух отдельных файлах, клиенте и адресе. Адрес будет использоваться в других местах, например, у продавцов есть адреса. Класс клиента должен ссылаться на класс адреса тремя способами. Клиент имеет судно по умолчанию для обращения (один к одному) законопроекта по умолчанию для адреса (один к одному) и его списка из нескольких адресов, которые могут быть выбраны, если значения по умолчанию не нужны. Класс клиента в файле 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
Высокий. Это отлично работает (если я не ошибаюсь), мне все равно нужно объявить одно для многих в классе Address. Таким образом, этот класс начнет иметь customer_id .. customer = relation ..., а затем еще две записи для поставщика и т. Д. Для того, чтобы больше использовать этот класс. хуже, когда приложение растет в любое время, когда я хочу использовать адрес, подобный этому, мне нужно изменить адрес. Есть ли способ сделать это в классе клиентов? – Ominus
Посмотрите на аргумент 'backref' для отношения, вы можете определить отношение для любого класса, и оно будет применено к другой стороне через backref. –
Я вижу. Чтобы сохранить код чистым, я бы лучше имел класс customer_address, который наследует адрес и просто добавляет поле customer_id foreighnkey? Я думаю, что это скорее вопрос практики борьбы с вредителями. – Ominus