1

我有一个存储电子邮件线程的 django 应用程序。当我从 mbox 解析原始电子邮件并将它们插入数据库时​​,我会包含电子邮件标头参数“message-id”和“in-reply-to”。message-id 是标识消息的唯一字符串,in-reply-to 标识给定消息响应的消息。

这是我的模型的消息部分:

class Message(models.Model):
    subject = models.CharField(max_length=300, blank=True, null=True)
    mesg_id = models.CharField(max_length=150, blank=True, null=True)
    in_reply_to = models.CharField(max_length=150, blank=True, null=True)
    orig_body = models.TextField(blank=True, null=True)

目标是能够以类似于 gmail 的线程格式显示电子邮件对话。我打算只使用邮件标头中的 message-id(模型中的mesg_id)和回复中的(模型中的 in_reply_to)来跟踪邮件并进行线程处理。

在查看了 SO 和 google 之后,看起来我应该使用 django-treebeard 或 django-mptt 之类的库来执行此操作。当我查看这两个解决方案中的任何一个的文档时,看起来大多数模型都使用外键关系,这让我感到困惑。

鉴于上面的示例模型,我如何在我的应用程序中实现 django-treebeard 或 django-mptt?这可以使用 mesg_id 和 in_reply_to 字段吗?

4

1 回答 1

0

如果我正在实现这个,我可能会尝试如下 - 使用 django-mptt:

from mptt.models import MPTTModel, TreeForeignKey

class Message(MPTTModel):
    subject = models.CharField(max_length=300, blank=True)
    msg_id = models.CharField(max_length=150, blank=True) # unique=True) <- if msg_id will definitely be unique
    reply_to = TreeForeignKey('self', null=True, blank=True, related_name='replies')
    orig_body = models.TextField(blank=True)

    class MPTTMeta:
        parent_attr = 'reply_to'

请注意,我已将 reply_to 变成了 ForeignKey。这意味着如果我有一个 Message 实例msg,我可以简单msg.reply_to地访问它作为回复的 Message 实例,或者msg.replies.all()获取对消息的所有回复。

理论上,您可以使用 msg_id 作为主键字段。我个人更喜欢将数据与主键分开,但我不知道有什么特别的理由认为我的方式更好。

于 2011-06-13T06:02:44.117 回答