2011-06-12 89 views
1

我有一個存儲電子郵件線程的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字段嗎?

回答

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()來獲得對該消息的所有回覆。

理論上,您可以使用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