Сортировка потоков электронной почты в django с использованием информации заголовка почты - PullRequest
1 голос
/ 12 июня 2011

У меня есть приложение django, которое хранит темы электронной почты. Когда я анализирую исходные письма из mbox и вставляю их в базу данных, я включаю параметры заголовка письма «message-id» и «in-reply-to». Идентификатор сообщения - это уникальная строка, которая идентифицирует сообщение, а функция 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. Я планировал просто использовать идентификатор сообщения (mesg_id в модели) и in-reply-to (in_reply_to в модели) из заголовков почты для отслеживания почты и выполнения потоков.

После просмотра SO и Google похоже, что для этого я должен использовать библиотеку вроде django-treebeard или django-mptt. Когда я просматриваю документацию для любого из этих двух решений, кажется, что большинство моделей используют отношения внешнего ключа, и это меня смущает.

Учитывая приведенный выше пример модели, как я могу внедрить в свое приложение django-treebeard или django-mptt? Возможно ли это с помощью полей mesg_id и in_reply_to?

1 Ответ

0 голосов
/ 13 июня 2011

Если бы я реализовывал это, я мог бы попробовать это следующим образом - используя 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, чтобы получить доступ к экземпляру сообщения, на которое он получил ответ, или msg.replies.all(), чтобы получить все ответы на сообщение.Теория, вы можете использовать msg_id в качестве поля первичного ключа.Я лично предпочитаю хранить данные отдельно от первичных ключей, но я не знаю какой-либо конкретной причины думать, что мой путь лучше.

...