2012-05-06 84 views
0

我有一種情況,我試圖創建一個快速簡單的管理界面,供作曲家在樂曲中列出樂器。我正在尋找的是一個單一的實體,一個儀器,它定義了一個特定的工具組合。例如,薩克斯管四重奏可能包括:Django管理員,多對多字段,多個重複條目

  1. 高音薩克斯
  2. 中音薩克斯
  3. 高音薩克斯
  4. 低音薩克斯

,但它也可以由兩個女低音,男高音和巴里不讀。當您嘗試添加整個部分時(如第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)
  • composition_id(FK),
  • INSTRUMENT_ID(FK)

它看起來像Django是在d創造這個確切的情況,我atabase,但由於某種原因,框架需要type,composition_idinstrument_id是唯一在一起。管理界面(多選框)也清楚地表明,具有多個類似的條目並不是多方面的設計工作的方式。那麼我如何實現這一目標呢?有沒有一個既定的解決方法呢?

回答

1

this question的選擇答案解決了它。我需要明確定義映射表,然後使用admin inline功能來修復界面。

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)