我有一个基于 django 的网上商店,在过去的一年里一直在发展。目前大约有 8 个国家特定的商店运行相同的代码库,外加一个 API,很快就会有一个 B2B 网站,还有一些国家要添加到列表中。
模型结构需要变化,特别是地址模型、帐户模型等中的字段。
让事情变得更复杂一些,该站点正在运行 multidb,每个商店实例都在一个单独的数据库中。所以我有一种情况,我可能有一个基本的 ABC 模型,例如:
class Address(models.Model):
class Meta:
abstract=True
class Address_UK(Address):
class Meta:
db_table="shop_address"
class Address_IT(Address):
class Meta:
db_table="shop_address"
[etc]
然后在整个应用程序中编码以选择正确的模型,例如
if countrysettings.country == "UK":
address = Address_UK()
elif countrysettings.country == "IT":
address = Address_IT()
countrysettings.country 实际上是一个单独的设置类,它是 threading.local 的子类,并且国家代码也对应于 settings.DATABASES 中的一个键,由地理定位中间件处理程序配置。因此选择了正确的数据库,并且模型特定的变化反映在每个国家的数据库中。
但是这种方法存在问题:
它完全破坏了同步数据库并且对南方没有好处,除非我破解 ./manage.py 以便我可以通过国家数据库,而不是需要中间件来设置它。
看起来很乱。如果 countrysettings.country == "xx": 代码就这么多,还有很多子类模型。
所以我想改用 django-eav,但我预见到管理中的问题,特别是字段排序。我知道 django-eav 将为管理员构建一个模型表单,其中包含 eav 字段,但我理想情况下希望这些与国家相关的显示或隐藏。
我还考虑过使用非抽象基类,例如地址,然后在需要时创建特定于国家/地区的变体(例如模型表继承)。但后来我预见到基本模型会因每个模型变体的 one2one 字段而过载。但它会解决管理员的问题。
另一种选择可能是有一个额外的数据字段,并将其他字段序列化为 json 或 csv 或其他内容并将它们存储在此字段中。