Django 模型中的循环引用?
Circular reference in Django model?
我想创建两个模型:1) 对话,它存储对带有标题的根消息的引用和 2) 消息,它存储消息的 content/text 和对活动的引用。计划是 link 消息并最终创建一个对话树。对话中的根消息将充当 linked 消息网络的头(入口)节点。
下面是我在模型文件中定义的(分别为conversations/models.py
和messages/models.py
):
from messages.models import Message
class Conversation(models.Model):
title = models.CharField('Conversation Title', max_length=500)
created_at = models.DateTimeField(auto_now_add=True)
composer = models.ForeignKey(User)
root_message = models.ForeignKey(Message, null=True, blank=True)
from conversations.models import Conversation
class Message(models.Model):
(foreignkey very likely)
conversation = models.ForeignKey(Conversation, null=True, blank=True)
content = models.TextField(db_index=True, max_length=500)
created_at = models.DateTimeField(auto_now_add=True)
问题是当我 运行 south 的 schemamigration messages --auto
或 schemamigration conversations --auto
时,我 运行 出现这样的错误:
class Campaign(models.Model):
File "C:\Users\Documents\GitHub\t4s\conversations\models.py", line 11, in Conversation
from messages.models import Message
ImportError: cannot import name Message
我相信这是因为 Message
和 Conversation
正在相互导入。但我希望每个 Message
实例都与 Conversation
关联,以便我可以参考对话的标题。我可以做些什么来在 Message
和 Conversation
中成功创建 Foreignkey
字段而无需更改模型的结构?预先感谢您的回答!
您应该使用字符串值来引用模型。然而,在我看来,这两个模型应该包含在同一个应用程序中。只看这段代码就让人觉得它的设计很糟糕,因为应用程序不应该有这样的循环引用。
此外,root_message 应该是 OneToOneField,因为一条消息与单个对话相关联,因此一条消息不可能成为多个对话的根。
class Conversation(models.Model):
title = models.CharField('Conversation Title', max_length=500)
created_at = models.DateTimeField(auto_now_add=True)
composer = models.ForeignKey(User)
root_message = models.ForeignKey('messages.Message', null=True, blank=True)
class Message(models.Model):
conversation = models.ForeignKey('conversations.Conversation', null=True, blank=True)
content = models.TextField(db_index=True, max_length=500)
created_at = models.DateTimeField(auto_now_add=True)
我想创建两个模型:1) 对话,它存储对带有标题的根消息的引用和 2) 消息,它存储消息的 content/text 和对活动的引用。计划是 link 消息并最终创建一个对话树。对话中的根消息将充当 linked 消息网络的头(入口)节点。
下面是我在模型文件中定义的(分别为conversations/models.py
和messages/models.py
):
from messages.models import Message
class Conversation(models.Model):
title = models.CharField('Conversation Title', max_length=500)
created_at = models.DateTimeField(auto_now_add=True)
composer = models.ForeignKey(User)
root_message = models.ForeignKey(Message, null=True, blank=True)
from conversations.models import Conversation
class Message(models.Model):
(foreignkey very likely)
conversation = models.ForeignKey(Conversation, null=True, blank=True)
content = models.TextField(db_index=True, max_length=500)
created_at = models.DateTimeField(auto_now_add=True)
问题是当我 运行 south 的 schemamigration messages --auto
或 schemamigration conversations --auto
时,我 运行 出现这样的错误:
class Campaign(models.Model):
File "C:\Users\Documents\GitHub\t4s\conversations\models.py", line 11, in Conversation
from messages.models import Message
ImportError: cannot import name Message
我相信这是因为 Message
和 Conversation
正在相互导入。但我希望每个 Message
实例都与 Conversation
关联,以便我可以参考对话的标题。我可以做些什么来在 Message
和 Conversation
中成功创建 Foreignkey
字段而无需更改模型的结构?预先感谢您的回答!
您应该使用字符串值来引用模型。然而,在我看来,这两个模型应该包含在同一个应用程序中。只看这段代码就让人觉得它的设计很糟糕,因为应用程序不应该有这样的循环引用。
此外,root_message 应该是 OneToOneField,因为一条消息与单个对话相关联,因此一条消息不可能成为多个对话的根。
class Conversation(models.Model):
title = models.CharField('Conversation Title', max_length=500)
created_at = models.DateTimeField(auto_now_add=True)
composer = models.ForeignKey(User)
root_message = models.ForeignKey('messages.Message', null=True, blank=True)
class Message(models.Model):
conversation = models.ForeignKey('conversations.Conversation', null=True, blank=True)
content = models.TextField(db_index=True, max_length=500)
created_at = models.DateTimeField(auto_now_add=True)