2012-05-06 13 views
0

私は、作曲家が音楽の楽器をリストするための迅速かつ簡単な管理インターフェースを作成しようとしている状況があります。私が探しているのは、単一のエンティティ、Instrumentationです。これは、特定の楽器の組み合わせを定義しています。例えば、サクソフォーン四重奏はから成るかもしれない:Django admin、多くのフィールド、いくつかの重複したエントリ

  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) 

それはシンプルよりもですので、私は、後でなどリハーサル、コンサート、で演奏する曲で各楽器をマッピングすることを計画私が必要とする数えます。 、

  • ID(int型シリアルPK)、
  • タイプ(FK):私はジャンゴ(すなわち、単にSQLとデータベース設計)なしでこれをやっていたならば、私は

    計装とのマッピングテーブルを持っているでしょう

  • DjangoはDに私にとっては、まさにこのような状況を生み出しているように見えますcomposition_id(FK)、
  • INSTRUMENT_ID(FK)

何らかの理由でフレームワークにtype,composition_idおよびinstrument_idが一意になる必要があります。管理インターフェイス(マルチセレクションボックス)は、複数の類似したエントリを持つことは、多対多フィールドがどのように動作するように設計されたかではないことも明らかにしています。だから私はこれをどのように達成するのですか?このために確立された回避策はありますか?

答えて

1

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

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) 
関連する問題