Могли бы вы иметь отдельную модель ReadPost
вместо потенциально большого м2, которую вы могли бы сохранить, когда пользователь читает сообщение? Таким образом, вы можете просто запросить модели ReadPost
, чтобы получить данные, вместо того, чтобы хранить их все в сообщении в блоге.
Может быть что-то вроде этого:
from django.utils import timezone
class UserReadPost(models.Model):
user = models.ForeignKey("auth.User", on_delete=models.CASCADE, related_name="read_posts")
seen_at = models.DateTimeField(default=timezone.now)
post = models.ForeignKey(BasicPost, on_delete=models.CASCADE, related_name="read_by_users")
Вы можете добавить unique_together
ограничение, чтобы убедиться, что только один UserReadPost
объект создан для каждого пользователя и публикации (чтобы вы не учитывали дважды), и используйте get_or_create()
при создании новых записей.
Затем можно найти сообщения, которые прочитал пользователь: posts = UserReadPost.objects.filter(user=current_user).values_list("post", flat=True)
Это также можно относительно легко расширить. Например, если ваши BasicPost
объекты могут быть отредактированы, вы можете добавить к сообщению поле updated_at
. Затем вы можете сравнить seen_at
поля UserReadPost
с полем updated_at
поля BasicPost
, чтобы проверить, видели ли они обновленную версию.
Недостатком является то, что вы будете создавать много строк в БД для этой таблицы.