私はこの1年で進化しているdjangoベースのウェブショップを持っています。現在、同じコードベースに加えてAPIを実行している国固有のショップが約8つあり、まもなくB2B Webサイトが作成され、さらにいくつかの国がリストに追加されます。
モデル構造には、特に住所モデルや勘定モデルなどのフィールドの周りにバリエーションが必要です。
さらに複雑なことに、サイトはマルチデータベースを実行しており、各ショップインスタンスは別々のデータベースにあります。したがって、ベース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をハックして、ミドルウェアに設定する代わりに国のdbを渡すことができない限り、syncdbを完全に破壊し、南には適していません。
散らかっているようです。countrysettings.country == "xx"の場合はこれだけです:コードがうそをついている、そして非常に多くのサブクラス化されたモデル。
そのため、代わりにdjango-eavを使用することを考えていましたが、管理者、特にフィールドの順序に問題があると予想しています。django-eavがeavフィールドを含む管理者用のモデルフォームを作成することは知っていますが、理想的には、国に関連してこれらを表示または非表示にする必要があります。
また、Addressなどの抽象化されていない基本クラスを用意し、必要に応じて国固有のバリエーションを作成することも検討しました(Model Table Inheritanceなど)。しかし、その後、各モデルバリアントに対してone2oneフィールドでベースモデルが過負荷になると予測します。しかし、それは管理者の問題を解決するでしょう。
別のオプションとして、追加のデータフィールドを用意し、追加のフィールドをjsonやcsvなどにシリアル化して、このフィールドに保存することもできます。