0

私は簡単なサイトに取り組んでいます。管理者が作成して維持する特定のリストからサービスを提供するマスターがいます。特定のマスターは、サービスのサブセットを提供できます。特定のサービスを 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 のイデオロギーと相関する最良の方法を学びたいと思っています。

4

1 に答える 1

0

https://docs.djangoproject.com/en/dev/misc/design-philosophies/ および

import this

インタプリタから python の哲学を取得します。

それは哲学のためです。

クラスの作成は、1 つの関数で実行できる場合は重い場合があります。エレガントじゃない、とあなたは言いました。保存されたブール値を作成しています... やりすぎです。

続いて3つ目の案。十分近い!「マスタービューテンプレート」 いくつかのチェックを繰り返したい場合は、「ビュー」にあり、ロジックが許可します。処理されたデータを表示するためだけに受信する、データのプレゼンテーション (処理ではない) であるテンプレートにはありません。

于 2013-08-27T23:32:07.070 に答える