2012-01-07 4 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 будет иметь fkeys для адресов и клиентов. Другой вариант - создать отдельную таблицу для customer_addresses vs vendor_addresses. Если вы хотите, чтобы сделать это лучшим способом было бы создать AddressMixin, который можно применить к различным объектам:

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

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

Высокий. Это отлично работает (если я не ошибаюсь), мне все равно нужно объявить одно для многих в классе Address. Таким образом, этот класс начнет иметь customer_id .. customer = relation ..., а затем еще две записи для поставщика и т. Д. Для того, чтобы больше использовать этот класс. хуже, когда приложение растет в любое время, когда я хочу использовать адрес, подобный этому, мне нужно изменить адрес. Есть ли способ сделать это в классе клиентов? – Ominus

+0

Посмотрите на аргумент 'backref' для отношения, вы можете определить отношение для любого класса, и оно будет применено к другой стороне через backref. –

+0

Я вижу. Чтобы сохранить код чистым, я бы лучше имел класс customer_address, который наследует адрес и просто добавляет поле customer_id foreighnkey? Я думаю, что это скорее вопрос практики борьбы с вредителями. – Ominus

Смежные вопросы