Django admin,多对多字段,多个重复条目

Posted

技术标签:

【中文标题】Django admin,多对多字段,多个重复条目【英文标题】:Django admin, many to many field, several duplicate entries 【发布时间】:2012-05-15 12:58:19 【问题描述】:

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

    高音萨克斯 中音萨克斯 中音萨克斯 男中音萨克斯

但它也可能包含两个中音,男高音和巴里 instread。当您尝试添加整个部分(例如 1st violins -- 多达 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 serial PK), 类型(FK), composition_id (FK), instrument_id (FK)

看起来 Django 正在数据库中为我创建这种确切的情况,但由于某种原因,框架需要 typecomposition_idinstrument_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)

【讨论】:

以上是关于Django admin,多对多字段,多个重复条目的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中,我如何根据两个模型中的字段自动创建多对多条目

在 django admin 中使用 related_name 配置多对多字段

Django admin - 如何在自定义管理表单中为多对多字段添加绿色加号

如何使用django管理员多对多个字段选择器小部件

在 Django Admin 中过滤多对多框

Python入门自学进阶-Web框架——6Django的ORM-多对多admin应用