我有一个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字段?
发布于 2011-06-13 14:02:44
如果我要实现它,我可能会尝试如下所示-使用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。这意味着,如果我有一个消息实例msg,我可以简单地执行msg.reply_to来访问它所回复的message实例,或者执行msg.replies.all()来获得对该消息的所有回复。
理论上,您可以使用msg_id作为主键字段。我个人更喜欢将数据与主键分开,但我不知道有什么特别的理由认为我的方法更好。
https://stackoverflow.com/questions/6322024
复制相似问题