Непрочитанные сообщения Django - PullRequest
0 голосов
/ 06 февраля 2020

Я создал блог, используя Django (очень функциональный блог), и хочу, чтобы я мог показывать пользователю в своем блоге только те сообщения, которые он еще не прочитал. У меня более 10000 сообщений, и я хочу показывать пользователю каждый раз, когда он входит в случайные сообщения, которые он еще не видел / я новичок с Django, и я не уверен, что должен делать это правильно. У меня есть почтовая модель:

class Post(models.Model):
author = models.ForeignKey('auth.User',on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)

def publish(self):
    self.published_date = timezone.now()
    self.save()

def approve_comments(self):
    return self.comments.filter(approved_comment=True)

def get_absolute_url(self):
    return reverse("post_detail",kwargs={'pk':self.pk})

def __str__(self):
    return self.title

Спасибо!

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Вы должны вести учет пользователя и какие сообщения он прочитал. Точно так же

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 сообщение.

1 голос
/ 06 февраля 2020

Вы должны использовать ManyToManyField :

class Post(models.Model):
author = models.ForeignKey('auth.User',on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)
read_users = models.ManyToManyField(User) # Add this line

def publish(self):
    self.published_date = timezone.now()
    self.save()

def approve_comments(self):
    return self.comments.filter(approved_comment=True)

def get_absolute_url(self):
    return reverse("post_detail",kwargs={'pk':self.pk})

def __str__(self):
    return self.title
...