我有一个情况,我试图创建一个快速和简单的管理界面,为作曲家列出的乐器在一段音乐。我要找的是一个单一的实体,一个仪器,它定义了一种特殊的乐器组合。例如,萨克斯管四重奏可能包括:
但它也可能由两个阿尔托斯,男高音和巴里组成。当你尝试添加一个完整的部分(比如第一小提琴--多达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和数据库设计),我就有一个映射表
仪器仪表:
似乎Django正在为我在数据库中创建这种情况,但出于某种原因,框架需要type、composition_id和instrument_id在一起是唯一的。管理界面(多选择框)也清楚地表明,拥有多个相似的条目并不是多到多个字段所设计的工作方式。那我怎么做到这一点呢?有现成的解决办法吗?
发布于 2012-05-06 23:18:43
选择的this question答案解决了这个问题。我需要显式定义映射表,然后使用admin内联特性来修复接口。
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)https://stackoverflow.com/questions/10474959
复制相似问题