私は簡単なサイトに取り組んでいます。管理者が作成して維持する特定のリストからサービスを提供するマスターがいます。特定のマスターは、サービスのサブセットを提供できます。特定のサービスを 1 回だけ提供することも、まったく提供しないこともできます。また、特定の価格で提供することもできます。これが私がこれまでに持っているものです、それはかなり明白です:
class Service(models.Model):
name = models.CharField(max_length=200)
class Master(models.Model):
name = models.CharField(max_length=200)
services = models.ManyToManyField(Service, through='MasterService')
class MasterService(models.Model):
master = models.ForeignKey(Master)
service = models.ForeignKey(Service)
price = models.PositiveIntegerField(blank=True, null=True) # masters can avoid listing the exact price if they want
class Meta:
unique_together=("master", "service")
しかし、マスターをビューに表示するときは、利用可能なすべてのサービスを一覧表示する必要があります。これには、特定のマスターが提供しないものも含め、適切なコメントが付けられます。この機能を実現する最善の方法は何ですか?
私はこれらの可能な解決策を持っています:
ビューアに特別なヘルパー クラスを作成します。これは、MasterService と、サービスが利用可能かどうかを示す特別なブール値で構成されます。特定のマスターのビューが呼び出されるたびに、可能なすべてのサービスに対してこのクラスのオブジェクトのリストを作成します。簡単に見えますが、エレガントではありません。
この特別なブール フィールドを MasterService クラス自体に作成します。そうすれば、Master*Service の任意の組み合わせに対してデータベースの MasterService オブジェクトを作成して保存する必要がありますが、これは過剰に思えます。
利用可能なすべてのサービスをマスター ビュー テンプレートに渡し、テンプレート内でそれらを反復処理して、それらが master.masterservice_set に存在するかどうかをそれぞれチェックします。最善の方法のようですが、django のテンプレート システムでそれを行う方法がわかりません。
PS: 私はその機能を実行するための可能な解決策を探すだけでなく、django と python のイデオロギーと相関する最良の方法を学びたいと思っています。