Django:不能包含ManyToManyField字段,因为手动指定"直通"模型

Vin*_*.AI 12 python django

我google了很多次,发现只有一个解决方案,通过第三个模型为两个模型添加自定义中间模型.我像往常一样应用了建议,但仍然遇到这个问题:

不能包含ManyToManyField字段'terms',因为'terms'手动指定'through'模型

models.py

class Term(models.Model):
    class Meta:
        db_table = "tbl_term"

    name = models.CharField(max_length=32)

class Post(models.Model):
    class Meta:
        db_table = "tbl_post"

    title = models.CharField(max_length=96)
    content = models.TextField()

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

class TermRelation(models.Model):
    class Meta:
        db_table = "tbl_term_relation"

    term = models.ForeignKey("Term", db_column="id_term")
    post = models.ForeignKey("Post", db_column="id_post")
Run Code Online (Sandbox Code Playgroud)

admin.py

@admin.register(Term)
class AdminTerm(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields': ['name']})
    ]

@admin.register(Post)
class AdminPost(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields':['title', 'content', 'terms']})
    ]
Run Code Online (Sandbox Code Playgroud)

kar*_*ikr 15

您必须更改管理员以包含InlineModelAdmin对象

所以,改变

class AdminPost(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields':['title', 'content', 'terms']})
    ]
Run Code Online (Sandbox Code Playgroud)

class TermInlineAdmin(admin.TabularInline):
    model = Post.terms.through


class AdminPost(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields':['title', 'content']})
    ]

    inlines = (TermInlineAdmin,)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@karthikr,这也适用于:class TermInlineAdmin(admin.TabularInline):model = TermRelation但我的问题是,为什么Django没有显示单个<select>元素作为列表来通过按住控制键来选择多个项目. (4认同)
  • 那么,4年后,2017/dj2.0我们仍然不能在Django中使用基本模型?我是否应该向最终用户解释,这只有一个字段必须位于单独的选项卡上,并且不能像任何其他字段一样编辑? (2认同)