SQLAlchemy,同一张表上的一对一关系
我有一个位置课程。位置可以具有默认的“帐单地址”,这也是位置。我正在使用的字段是 CustomerLocation 类中的 bill_to_id
和 bill_to
。为了完整起见,我已经将父类包含在内。如何将一个地点设置为另一地点的收单地址?这种关系应该是一对一的(一个位置只能有一个收单方)。不需要反向引用。
TIA
class Location(DeclarativeBase,TimeUserMixin):
__tablename__ = 'locations'
location_id = Column(Integer,primary_key=True,autoincrement=True)
location_code = Column(Unicode(10))
name = Column(Unicode(100))
address_one = Column(Unicode(100))
address_two = Column(Unicode(100))
address_three = Column(Unicode(100))
city = Column(Unicode(100))
state_id = Column(Integer,ForeignKey('states.state_id'))
state_relate = relation('State')
zip_code = Column(Unicode(100))
phone = Column(Unicode(100))
fax = Column(Unicode(100))
country_id = Column(Integer,ForeignKey('countries.country_id'))
country_relate = relation('Country')
contact = Column(Unicode(100))
location_type = Column('type',Unicode(50))
__mapper_args__ = {'polymorphic_on':location_type}
class CustomerLocation(Location):
__mapper_args__ = {'polymorphic_identity':'customer'}
customer_id = Column(Integer,ForeignKey('customers.customer_id',
use_alter=True,name='fk_customer_id'))
customer = relation('Customer',
backref=backref('locations'),
primaryjoin='Customer.customer_id == CustomerLocation.customer_id')
tbred_ship_code = Column(Unicode(6))
tbred_bill_to = Column(Unicode(6))
ship_method_id = Column(Integer,ForeignKey('ship_methods.ship_method_id'))
ship_method = relation('ShipMethod',primaryjoin='ShipMethod.ship_method_id == CustomerLocation.ship_method_id')
residential = Column(Boolean,default=False,nullable=False)
free_shipping = Column(Boolean,default=False,nullable=False)
collect = Column(Boolean,default=False,nullable=False)
third_party = Column(Boolean,default=False,nullable=False)
shipping_account = Column(Unicode(50))
bill_to_id = Column(Integer,ForeignKey('locations.location_id'))
bill_to = relation('CustomerLocation',remote_side=['locations.location_id'])
I have a Location class. Locations can have default "bill to addresses" which are also locations. The fields that I am working with are bill_to_id
and bill_to
in class CustomerLocation. I have included the parent class a well for completeness. How can I set one location as the bill-to of another location? The relationship should be one-to-one (a location will only ever have one bill-to). No backref is needed.
TIA
class Location(DeclarativeBase,TimeUserMixin):
__tablename__ = 'locations'
location_id = Column(Integer,primary_key=True,autoincrement=True)
location_code = Column(Unicode(10))
name = Column(Unicode(100))
address_one = Column(Unicode(100))
address_two = Column(Unicode(100))
address_three = Column(Unicode(100))
city = Column(Unicode(100))
state_id = Column(Integer,ForeignKey('states.state_id'))
state_relate = relation('State')
zip_code = Column(Unicode(100))
phone = Column(Unicode(100))
fax = Column(Unicode(100))
country_id = Column(Integer,ForeignKey('countries.country_id'))
country_relate = relation('Country')
contact = Column(Unicode(100))
location_type = Column('type',Unicode(50))
__mapper_args__ = {'polymorphic_on':location_type}
class CustomerLocation(Location):
__mapper_args__ = {'polymorphic_identity':'customer'}
customer_id = Column(Integer,ForeignKey('customers.customer_id',
use_alter=True,name='fk_customer_id'))
customer = relation('Customer',
backref=backref('locations'),
primaryjoin='Customer.customer_id == CustomerLocation.customer_id')
tbred_ship_code = Column(Unicode(6))
tbred_bill_to = Column(Unicode(6))
ship_method_id = Column(Integer,ForeignKey('ship_methods.ship_method_id'))
ship_method = relation('ShipMethod',primaryjoin='ShipMethod.ship_method_id == CustomerLocation.ship_method_id')
residential = Column(Boolean,default=False,nullable=False)
free_shipping = Column(Boolean,default=False,nullable=False)
collect = Column(Boolean,default=False,nullable=False)
third_party = Column(Boolean,default=False,nullable=False)
shipping_account = Column(Unicode(50))
bill_to_id = Column(Integer,ForeignKey('locations.location_id'))
bill_to = relation('CustomerLocation',remote_side=['locations.location_id'])
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
请参阅我的相关问题的答案< /a>.通过在表中声明自引用外键,可以在声明式中拥有自引用关系,并且可以在声明类后立即对其进行“猴子修补”,或者将外来列名称指定为字符串而不是类字段。示例:
我之前已经成功地使用了这种技术,它为您提供了父子树关系的两个方向(其中单个父记录可以有多个子记录)。如果您省略
backref
参数,它可能适合您,也可能不适合您。您始终可以简单地选择在应用程序中仅使用关系的一个方向。See my answer to a related question. You can have self-referential relationships in declarative by declaring a self-referential foreign key in the table, and either "monkey-patching" the class just after it is declared or specifying the foreign column names as strings rather than class fields. Example:
I've successfully used this technique before which gives you both directions of the parent-child tree relationship (where a single parent can have multiple child records). If you omit the
backref
argument it may or may not work for you. You could always simply choose to use only one direction of the relationship in your application.