2011-09-30 55 views
2

假设我们有两个自递归关系的典范:模型在Django管理递归自我关系

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的管理员中注册我的模型时,我的子标题显示为“一对一” - 在这两种情况下都有选择框,但后者中的多个值不能被选中,不过,可以添加多个值。通过管理窗格本条对象和后面的孩子列出他们

我想有是这样的:。的 ,而不是正常的下拉

感谢

回答

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 

在管理界面来显示subarticles最简单的方法就是给我们e InlineModelAdmin

class ArticleInline(admin.StackedInline): 
    model = Article 

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

非常感谢您的解释 - 它帮助了我很多。虽然我有一点(我希望是最后一个)问题。如果我指定要显示的字段:'fieldsets = [(None,{'fields':...'parent','subatricles']})''Django显示我'错误地配置在...'ArticleAdmin.fieldsets [0] [1] ['fields']'指的是表单中缺少的字段'subarticles'。我怎样才能避免这种情况?我希望能够将现有的文章添加到文章的孩子们在多选框中选择他们。 – laszchamachla

+0

@Up - 我需要类似的解决方案,如下所示:[link](http://stackoverflow.com/questions/1691299/can-django-admin-handle-a-one-to-many-relationship-via-related-name/5018393#5018393)对于Django中的ManyToMany问题Admin: – laszchamachla

+0

您将能够添加孩子到文章,这就是“内联”的用途。顺便说一句,如果你只有一个字段集,根本不需要指定它。完全从管理员那里拿出“fieldset”,它现在工作吗? –