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

时间:2011-09-30 19:48:09

标签: 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')

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

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

我想要的是: <{0}}而不是正常的下拉列表。

感谢。

1 个答案:

答案 0 :(得分:6)

您只需要一个字段 subarticles 作为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')

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

article.parent

如果你想要孩子,你可以使用:

article.subarticles

在显示子文章的管理界面中,最简单的方法是使用InlineModelAdmin

class ArticleInline(admin.StackedInline):
    model = Article

class ArticleAdmin(admin.ModelAdmin):
    inlines = [
        ArticleInline,
    ]