对于 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")
Run Code Online (Sandbox Code Playgroud)
我使用国家/地区模型将世界各国的名称和代码填充到数据库中。(维基百科)
现在我实例化一个地址对象 ,a1并c1为其分配一个国家/地区对象:
a1.country = c1
Run Code Online (Sandbox Code Playgroud)
这有效;现在我可以这样做:
a1.country.name
>>> 'Iceland'
Run Code Online (Sandbox Code Playgroud)
不过,我也可以这样做:
a1.country.name = 'Switzerland'
a1.country.name
>>> 'Switzerland'
Run Code Online (Sandbox Code Playgroud)
这不是我想要的。我希望能够使用数据库中的国家/地区来分配地址对象,并从地址对象中引用国家/地区,但是只能通过直接访问国家/地区对象来更改国家/地区对象,例如一个孤立的国家/地区对象是对数据库的查询结果。
我想使用国家/地区映射作为只读引用,其中包含地址国家/地区列的允许值。
我怎样才能做到这一点?
我在 Address 类定义中尝试了以下操作:
country = relationship("Country", viewonly=True)
Run Code Online (Sandbox Code Playgroud)
但是,当我使用上述 viewonly 关系映射创建一个地址并为其分配一个国家/地区对象(通过将地址的country_id 设置为国家/地区的 id),然后从地址对象更改国家/地区对象的名称时,我会得到相同的行为:
将具有更改的国家/地区名称的地址对象提交到数据库并将其读回后,国家/地区名称将被更改(来自地址类对象)。
应该怎么做呢?