在Django的管理员中具有递归自我关系的模型

las*_*hla 2 django django-admin

假设我们有一个具有两个自递归关系的模型:

class Article(Item): # Item in this case is an abstract class
    date = models.DateField()
    parent = models.OneToOneField('self', null=True, blank=True)
    subatricles = models.ForeignKey('self', null=True, blank=True, related_name='subs')
Run Code Online (Sandbox Code Playgroud)

文章在这里作为节点 - 它可以有许多孩子(如果提供)和一个父母(如果有的话).但是,当我在Django的管理员中注册我的模型时,我的子系统被显示为"一对一" - 在这两种情况下都有选择框,但在后者中,不能选择多个值.

如何通过管理窗格将子项添加到此Article对象,然后列出它们?

我想拥有的是: 而不是正常的下拉.

谢谢.

Ser*_*nko 6

您只需要一个具有subarticles的字段parent作为related_name来提供反向查找:

class Article(Item): # Item in this case is an abstract class
    date = models.DateField()
    parent = models.ForeignKey('self', null=True, blank=True, related_name='subarticles')
Run Code Online (Sandbox Code Playgroud)

因此,如果您有一个文章对象并且想要获取其父对象,请使用:

article.parent
Run Code Online (Sandbox Code Playgroud)

如果你想得到它的孩子,你使用:

article.subarticles
Run Code Online (Sandbox Code Playgroud)

在管理界面来显示subarticles最简单的方法是使用InlineModelAdmin:

class ArticleInline(admin.StackedInline):
    model = Article

class ArticleAdmin(admin.ModelAdmin):
    inlines = [
        ArticleInline,
    ]
Run Code Online (Sandbox Code Playgroud)