0

作曲家が音楽の楽器を一覧表示するための、すばやく簡単な管理インターフェイスを作成しようとしている状況があります。私が探しているのは、インストルメントの特定の組み合わせを定義する単一のエンティティ、インストルメンテーションです。たとえば、サックス四重奏団は次のメンバーで構成されます。

  1. ソプラノサックス
  2. アルトサックス
  3. テナーサックス
  4. バリトンサックス

しかし、2 つのアルト、テナーとバーリ インストレッドで構成されている場合もあります。セクション全体を追加しようとすると、問題はさらに悪化します (第 1 ヴァイオリンのように、18 人ものメンバーもいます)。

私が思いついた最初のモデルは次のようになります。

class Work(Post):
    authors = models.ManyToManyField(Individual)
    title = models.CharField(max_length=255)
    subtitle = models.CharField(max_length=255, blank=True)
    program_notes = models.TextField(blank=True)
    notes = models.TextField(blank=True)
    media = models.ManyToManyField('Upload')

class Composition(Work):
    instrumentation = models.ForeignKey('Instrumentation')

class Instrumentation(models.Model):
    forces = models.ManyToManyField(Instrument)
    types = models.ManyToManyField('InstrumentationType')

class InstrumentationType(models.Model):
    type = models.CharField(max_length=255)
    variation = models.SmallIntegerField(default=0)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

後で、曲の各楽器をリハーサルやコンサートなどの演奏者にマッピングする予定なので、必要なのは単純な数ではありません。django を使用せずに (つまり、SQL とデータベースの設計だけで) これを行っていた場合、次のようなマッピング テーブルが作成されます。

計装:

  • id (int シリアル PK)、
  • タイプ (FK)、
  • 構成_id (外部キー),
  • インストゥルメント ID (外部キー)

Django がデータベースでこの正確な状況を作成しているように見えますが、何らかの理由で、フレームワークが必要typecomposition_idあり、instrument_id一緒に一意である必要があります。また、管理インターフェイス (複数選択ボックス) は、複数の同様のエントリを持つことは、多対多フィールドが機能するように設計されている方法ではないことを明確にしています。では、どうすればこれを達成できますか?これに対する確立された回避策はありますか?

4

1 に答える 1

1

この質問に対する選択された答えはそれを解決します。マッピング テーブルを明示的に定義してから、管理インライン機能を使用してインターフェイスを修正する必要がありました。

models.py:

class Instrumentation(models.Model):
    forces = models.ManyToManyField(Instrument, through='InstrumentationForces')
    types = models.ManyToManyField('InstrumentationType')

class InstrumentationForces(models.Model):
    instrument = models.ForeignKey(Instrument)
    instrumentation = models.ForeignKey(Instrumentation)

admin.py:

class InstrumentInline(admin.TabularInline):
    model = InstrumentationForces
    extra = 3

class InstrumentationAdmin(admin.ModelAdmin):
    filter_horizontal = ('types',)
    inlines = (InstrumentInline,)
admin.site.register(Instrumentation, InstrumentationAdmin)
于 2012-05-06T23:18:43.887 に答える