1

メールスレッドを保存する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などのライブラリを使用する必要があるようです。これら2つのソリューションのいずれかのドキュメントを確認すると、ほとんどのモデルが外部キーの関係を使用しているように見え、これで混乱します。

上記のモデルの例を考えると、アプリにdjango-treebeardまたはdjango-mpttを実装するにはどうすればよいですか?これは、mesg_idフィールドとin_reply_toフィールドを使用して可能ですか?

4

1 に答える 1

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に変えたことに注意してください。これは、メッセージインスタンスがある場合、それが返信されたメッセージインスタンスにアクセスするか、メッセージへのすべての返信を取得するためにmsg簡単に実行できることを意味します。msg.reply_tomsg.replies.all()

理論的には、msg_idを主キーフィールドとして使用できます。私は個人的にデータを主キーから分離することを好みますが、自分のやり方がより良いと考える特別な理由はわかりません。

于 2011-06-13T06:02:44.117 に答える