在Django中显示多对多(通过)和自引用关系

时间:2013-06-21 16:47:56

标签: django django-models django-admin

我在Django 1.5中设置了一个自引用模型,如下所示:

RELATIONSHIP_PARENT = 1
RELATIONSHIP_BLOCKED = 2
RELATIONSHIP_STATUSES = (
    (RELATIONSHIP_PARENT, 'Parent'),
    (RELATIONSHIP_BLOCKED, 'Blocked'),
) 

class Message(models.Model):
    content = models.CharField("Content", max_length=160, db_index=True)
    relationships = models.ManyToManyField('self',
        through='Relationship',
        symmetrical=False,
        related_name='related_to')

class Relationship(models.Model):
    parent_message = models.ForeignKey(Message, related_name='parent_messages')
    child_message = models.ForeignKey(Message, related_name='child_messages')
    status = models.IntegerField(choices=RELATIONSHIP_STATUSES)

这受到帖子http://charlesleifer.com/blog/self-referencing-many-many-through的启发,他描述了“非对称关系 - 推特模式”(我的目标是在消息之间建立父子关系,但这可能是这个问题的无关信息)。我试图配置Django管理页面以在Relationship部分下显示Message信息。我试着遵循我似乎是Django文档中最接近的例子,如下所示

from django.contrib import admin
from demo.models import Message, Relationship

class RelationshipInline(admin.TabularInline):
    model = Relationship
    extra = 1

class MessageAdmin(admin.ModelAdmin):
    inlines = (RelationshipInline,)

admin.site.register(Message, MessageAdmin)
admin.site.register(Relationship)

但我得到的错误如下:

Exception at /admin/
<class 'demo.models.Relationship'> has more than 1 ForeignKey to <class 'demo.models.Message'>

我知道我的情况与Django文档的示例略有不同,因为我有一个自引用模型。我想知道是否有办法通过管理控制台在一个视图/页面中显示特定消息的关系(比如当前的孩子和父母)。如果是这样,有人可以告诉我该怎么做吗?我是Django的新手还在学习,如果这个问题太天真,那么道歉。谢谢。

2 个答案:

答案 0 :(得分:2)

试试这个

class RelationshipInline(admin.TabularInline):
    model = Relationship
    extra = 1
    fk_name = 'parent_message' # or 'child_message' depending on which you want to include

在这种情况下,您需要设置2中的哪一个被视为FK

答案 1 :(得分:0)

正如doc所说

  

您的中间模型必须包含一个 - 且只有一个 - 目标模型的外键(在我们的示例中,这将是Message)。如果您有多个外键,则会引发验证错误。