Python Django为什么为自定义直通模型创建堆叠元素

Python Django为什么为自定义直通模型创建堆叠元素,python,django,Python,Django,我有自己的关系表,并使用到参数映射两个模型。见: 型号.py class Term(models.Model): title = models.CharField(max_length=32) class Meta: db_table = "tbl_term" class Post(models.Model): title = models.CharField(max_length=64) content = models.TextField()

我有自己的关系表,并使用
参数映射两个模型。见:

型号.py

class Term(models.Model):
    title = models.CharField(max_length=32)
    class Meta:
        db_table = "tbl_term"

class Post(models.Model):
    title = models.CharField(max_length=64)
    content = models.TextField()

    terms = models.ManyToManyField("Term", through="Term_Post_Map")

    class Meta:
        db_table = "tbl_post"

class Term_Post_Map(models.Model):
    term = models.ForeignKey("Term", db_column="id_term")
    post = models.ForeignKey("Post", db_column="id_post")
    class Meta:
        db_table = "tbl_term_post_map"
class AdminPost(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields': ['title', 'content', 'terms']})
    ]
admin.py

class Term(models.Model):
    title = models.CharField(max_length=32)
    class Meta:
        db_table = "tbl_term"

class Post(models.Model):
    title = models.CharField(max_length=64)
    content = models.TextField()

    terms = models.ManyToManyField("Term", through="Term_Post_Map")

    class Meta:
        db_table = "tbl_post"

class Term_Post_Map(models.Model):
    term = models.ForeignKey("Term", db_column="id_term")
    post = models.ForeignKey("Post", db_column="id_post")
    class Meta:
        db_table = "tbl_term_post_map"
class AdminPost(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields': ['title', 'content', 'terms']})
    ]
上面的脚本引发此错误:

class TermInline(admin.TabularInline):
    model = Term_Post_Map
    fields = ["term"]
    extra = 1

class AdminPost(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields': ['title', 'content']})
    ]
    inlines = [TermInline]
“AdminPost.fieldsets[0][1]['fields']”不能包含ManyToManyField字段“terms”,因为“terms”手动指定了“through”模型

当我从
字段集
中删除
术语
并添加到
内联线
时,它会工作:

class TermInline(admin.TabularInline):
    model = Term_Post_Map
    fields = ["term"]
    extra = 1

class AdminPost(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields': ['title', 'content']})
    ]
    inlines = [TermInline]
但我不希望它以表格或堆叠的形式出现,就像这样:

为什么不在单个ListBox元素中提供:

class TermInline(admin.TabularInline):
    model = Term_Post_Map
    fields = ["term"]
    extra = 1

class AdminPost(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields': ['title', 'content']})
    ]
    inlines = [TermInline]
当我没有使用我自己的
通过
模型映射这两个模型时,它将出现在单个列表框元素中。与此相同:

Django建议在通过
模型指定
时使用内联线,因为中间表通常有额外的字段,这些字段不能在多个选择框中表示

在您的示例中,您没有任何额外的字段,因此最简单的方法是不指定直通模型。然后可以使用multiple select小部件


您可能必须通过
模型使用
,例如,您可能使用的是遗留数据库。不幸的是,在这种情况下,我不知道如何快速启用multiple select小部件。

我在Map表中有更多字段,这里没有显示。我可以为直通模型传递字段名称吗?恐怕我不确定“为直通模型传递字段名称”是什么意思。如果在
manytomy
关系表(
Term\u Post\u Map
)上有其他字段,则无法在管理中使用简单的multiselect小部件,因为当您向
Post
添加新的
Term
时,管理员不知道要为这些附加字段指定什么值。