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
时,管理员不知道要为这些附加字段指定什么值。