4

我在 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的启发,他在其中描述了“不对称关系 - Twitter 模型”(我的目标是在消息之间创建父子关系,但是这可能是与这个问题无关的信息)。我试图配置 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 新手,还在学习,如果这个问题太天真,请道歉。谢谢你。

4

2 回答 2

3

尝试这个

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

您需要设置FK在这种情况下要考虑的 2 个

于 2013-06-21T16:55:10.327 回答
0

正如医生所说

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

于 2013-06-21T17:05:22.763 回答