使用邮件标题信息在django中排序电子邮件线程

问题描述:

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

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

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和谷歌它看起来像我应该使用类似django-treebeard或django-mptt的库来做到这一点。当我查看这两种解决方案的文档时,看起来大多数模型都使用外键关系,这使我感到困惑。

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

如果我实现这个,我可能如下尝试 - 使用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作为主键字段。我个人更喜欢保持数据与主键分离,但我不知道有什么特别的理由认为我的方式更好。

+1

请记住,有时您可能会在收到origianl帖子之前收到回复,并将orig_in_reply_to作为CharField保存为@ajt,这对于使用“Message”可能以任何顺序匹配邮件是一个好主意。 objects.filter(orig_in_reply_to = new_message.msg_id)'。 – Udi 2011-06-13 07:16:28