我自己的关系表并使用through
参数映射两个模型。参见:
models.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"
admin.py
class AdminPost(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['title', 'content', 'terms']})
]
以上脚本引发此错误:
' AdminPost.fieldsets [0] [1] ['字段']'不能包含ManyToManyField字段' terms'因为'术语'手动指定一个'到'模型。
当我从'terms'
移除fieldsets
并添加到inlines
时,它就有效:
class TermInline(admin.TabularInline):
model = Term_Post_Map
fields = ["term"]
extra = 1
class AdminPost(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['title', 'content']})
]
inlines = [TermInline]
但我不希望以表格或堆叠格式显示,如下所示:
为什么不会出现在单个ListBox元素中:
当我不使用我自己的through
模型映射两个模型时,它会出现在单个ListBox元素中。像这样:
答案 0 :(得分:1)
Django建议在指定through
模型时使用内联,因为中间表通常具有额外的字段,这些字段无法在多个选择框中表示。
在您的示例中,您没有任何额外字段,因此最简单的方法是不指定直通模型。然后,您可以使用多选小部件。
您可能必须使用through
模型,例如您可能正在使用旧数据库。不幸的是,我不知道在这种情况下启用多选小部件的快速方法。