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