我在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的新手还在学习,如果这个问题太天真,那么道歉。谢谢。
答案 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)。如果您有多个外键,则会引发验证错误。