使用邮件头信息在django中对电子邮件线程进行排序

时间:2011-06-12 12:49:02

标签: django django-mptt django-treebeard email-threading

我有一个存储电子邮件主题的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(模型中的in_reply_to)来跟踪邮件并进行线程化。

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

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

1 个答案:

答案 0 :(得分: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()获取对该消息的所有回复。< / p>

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