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

我有一种情况,我正试图创建一个快速而简单的管理界面,供作曲家在一段音乐中列出乐器。我要寻找的是一个单一的实体,一个仪器,它定义了一个特定的仪器组合。例如,萨克斯管四重奏可能包括:

  • 女高音萨克斯
  • 中音萨克斯
  • 中音萨克斯
  • 男中音萨克斯
  • 但它也可能包括两个中音,男高音和巴里·因斯特雷德。当您尝试添加整个部分(如第一小提琴——多达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串行主键)
    • 类型(FK)
    • 成分识别码(FK)
    • 仪表盘id(FK)
    看起来Django在数据库中为我创建了这个确切的情况,但出于某种原因,框架需要
    类型
    组合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)