Сортировка потоков электронной почты в django с использованием информации заголовка почты

У меня есть приложение 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 ответ

Решение

Если бы я реализовывал это, я мог бы попробовать это следующим образом - используя 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 в качестве поля первичного ключа. Лично я предпочитаю хранить данные отдельно от первичных ключей, но я не знаю конкретной причины думать, что мой путь лучше.

Другие вопросы по тегам