Вы должны вести учет пользователя и какие сообщения он прочитал. Точно так же
class UserReadPost(models.Model):
user = models.ForeignKey(User, releated_name='user_read_posts')
post = models.ForeignKey(Post, releated_name='posts_read_by_users')
read_at = models.DateTimeField(auto_now=True)
Вам придется добавлять записи в эту таблицу каждый раз, когда пользователь читает какой-либо пост. Вы можете получить все сообщения, которые пользователь еще не читал, например, так:
from django.db.models import OuterRef, Subquery, Exists
post_read_status = UserReadPost.objects.filter(post=OuterRef('post'), user=current_user_object)
Post.objects.all().annotate(has_read=Exists(post_read_status)).exclude(has_read=True).order_by('?')
Это можно сделать с помощью ManyToManyField
, но добавление своей собственной таблицы даст вам возможность проверить, когда этот пользователь прочитал указанный c сообщение.