我有一个存储电子邮件主题的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字段吗?
答案 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用作主键字段。我个人更喜欢将数据与主键分开,但我不知道有什么理由认为我的方式更好。