使用SQLAlchemy,我想使用包含值的记录/字段的第一个表,这些值可以用作第二个表中字段的合法值。
但是,第一个表的记录不能从第二个表的字段中更改,只能被引用。
我在Sqlalchemy有一个包含两个模型的数据库:
class Country(Base):
__tablename__ = 'countries'
id = Column(Integer, primary_key=True)
name = Column(String, unique=True)
code = Column(String, unique=True)
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
row_1 = Column(String)
row_2 = Column(String)
row_3 = Column(String)
row_4 = Column(String)
row_5 = Column(String)
country_id = Column(Integer, ForeignKey('countries.id'))
country = relationship("Country")
我使用国家/地区模型使用世界各国的名称和代码填充数据库。 (Wikipedia)
现在我实例化一个地址对象a1
,并为其分配一个国家/地区对象c1
:
a1.country = c1
这有效;现在我可以这样做:
a1.country.name
>>> 'Iceland'
但是,我也可以这样做:
a1.country.name = 'Switzerland'
a1.country.name
>>> 'Switzerland'
这不是我想要的。我希望能够使用数据库中的国家分配地址对象并从地址对象引用国家/地区,但只有通过直接访问国家/地区对象才允许更改国家/地区对象,例如,隔离的国家/地区对象是对数据库的查询结果。
我想使用国家/地区映射作为只读参考,其中包含国家/地区列的允许值。
我该怎么做?
我在Address类定义中尝试了以下内容:
country = relationship("Country", viewonly=True)
但是,当我创建一个地址并为其分配一个国家/地区对象时(通过将address的country_id设置为Country的id)与上面的viewonly关系映射,然后从地址对象更改country对象的名称,我得到相同的行为:
将地址对象与更改的国家/地区名称一起提交到数据库并将其读回后,国家/地区名称将被更改(来自Address类对象)。
应该怎么做?