Django管理,多对多字段,多个重复条目
我有一种情况,我正试图创建一个快速而简单的管理界面,供作曲家在一段音乐中列出乐器。我要寻找的是一个单一的实体,一个仪器,它定义了一个特定的仪器组合。例如,萨克斯管四重奏可能包括:Django管理,多对多字段,多个重复条目,django,django-models,django-admin,many-to-many,Django,Django Models,Django Admin,Many To Many,我有一种情况,我正试图创建一个快速而简单的管理界面,供作曲家在一段音乐中列出乐器。我要寻找的是一个单一的实体,一个仪器,它定义了一个特定的仪器组合。例如,萨克斯管四重奏可能包括: 女高音萨克斯 中音萨克斯 中音萨克斯 男中音萨克斯 但它也可能包括两个中音,男高音和巴里·因斯特雷德。当您尝试添加整个部分(如第一小提琴——多达18个成员)时,问题会变得更糟 我提出的初始模型如下所示: class Work(Post): authors = models.ManyToManyField(Ind
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串行主键)
- 类型(FK)
- 成分识别码(FK)
- 仪表盘id(FK)
类型
,组合id
和仪器id
在一起是唯一的。管理界面(multiselect框)也清楚地表明,拥有多个类似的条目并不是多对多字段的设计目的。那么我该如何实现这一点呢?对此是否有既定的解决办法?选择的答案可以解决此问题。我需要显式定义映射表,然后使用admin内联功能修复接口
型号。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)
class InstrumentInline(admin.TabularInline):
model = InstrumentationForces
extra = 3
class InstrumentationAdmin(admin.ModelAdmin):
filter_horizontal = ('types',)
inlines = (InstrumentInline,)
admin.site.register(Instrumentation, InstrumentationAdmin)
admin.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)
class InstrumentInline(admin.TabularInline):
model = InstrumentationForces
extra = 3
class InstrumentationAdmin(admin.ModelAdmin):
filter_horizontal = ('types',)
inlines = (InstrumentInline,)
admin.site.register(Instrumentation, InstrumentationAdmin)