【问题标题】:Sorting email threads in django using mail header information使用邮件标题信息在 django 中对电子邮件线程进行排序
【发布时间】:2011-06-12 12:49:02
【问题描述】:

我有一个存储电子邮件线程的 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 字段吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 请记住,有时您可能会在收到原始帖子之前收到回复,并且像上面 @ajt 所做的那样将 orig_in_reply_to 保留为 CharField 是一个以任何可能的顺序匹配您的消息的好主意使用Message.objects.filter(orig_in_reply_to=new_message.msg_id)到达。
    猜你喜欢
    • 2021-02-06
    • 2011-07-07
    • 2015-05-17
    • 2016-10-21
    • 2016-06-30
    • 1970-01-01
    • 2012-07-11
    • 2020-02-23
    • 1970-01-01
    相关资源
    最近更新 更多