SQLAlchemy:如何引用只读表映射?

bet*_*ta2 5 python sqlalchemy

对于 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)

我使用国家/地区模型将世界各国的名称和代码填充到数据库中。(维基百科

现在我实例化一个地址对象 ,a1c1为其分配一个国家/地区对象:

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),然后从地址对象更改国家/地区对象的名称时,我会得到相同的行为:

将具有更改的国家/地区名称的地址对象提交到数据库并将其读回后,国家/地区名称将被更改(来自地址类对象)。

应该怎么做呢?