用于递归多对多的 Django Admin 内联

Posted

技术标签:

【中文标题】用于递归多对多的 Django Admin 内联【英文标题】:Django Admin inline for recursive ManyToMany 【发布时间】:2011-12-31 22:23:34 【问题描述】:

我有以下模型,它与自身具有多对多关系

class Ticket(models.Model):

    STATUS = (
        (0, "Open"),
        (1, "Closed"),
    )
    status = models.SmallIntegerField(default=0,choices=STATUS)
    title = models.CharField(max_length=100)
    replies = models.ManyToManyField('self')
    description = models.TextField()

我正在尝试使用以下代码在管理员中将此模型显示为内联

class TicketReply(admin.TabularInline):
    model = Ticket.replies.through

但是我一直收到这个错误

<class 'tsn.ticket.models.Ticket_replies'> has more than 1 ForeignKey to <class 'tsn.ticket.models.Ticket'>

所以我做错了,还是不支持?

【问题讨论】:

fk_name 和 related_name 是您应该检查的设置:docs.djangoproject.com/en/dev/ref/contrib/admin/… 我一直收到同样的错误,即使在添加了相关名称设置之后,并且在添加 fk_name 时它说“TicketReply.fk_name”指的是模型“Ticket_replies”中缺少的字段“回复”,我不'不认为这是支持的,因为查看源代码,在验证内联 django 时需要一个外键 你也应该发布 Ticket_replies 模型 【参考方案1】:

可能为时已晚,但我尝试回答这个问题。 Ticket.replies.through 是一个管理多对多关系的表,它有字段 from_ticket 和 to_ticket(FK to model Ticket),您可以将此字段设置为 TabularInline 的选项 fk_name。

class TicketReply(admin.TabularInline):
    model = Ticket.replies.through
    fk_name = 'from_ticket'

【讨论】:

fk_name 是递归定义的魔力!谢谢! 我知道这已经很老了,但仍然很遥远。如何使内联的字段在与其自身的多对多关系中可编辑? 感谢您的回答。在我看到这个之前,我面临着同样的问题。该文档让我失望,因为它指出为递归关系的直通表生成的字段名称是 to__id 和 from__id 但直到我看到你的答案才起作用t 为“fk_name”指定任何“_id”后缀

以上是关于用于递归多对多的 Django Admin 内联的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django admin 中自定义多对多内联模型

格式化 django admin 中呈现的内联多对多相关模型

多对多字段的 Django 1.2.1 内联管理

Django内联表单集通过另一个模型在多对多关系中过滤

Django Admin批量编辑多对多关系

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