Django: Как проверить, читал ли пользователь уже статью?

Я создаю веб-приложение для своего выпускного проекта с помощью Python и Django. У меня есть модель пользователя, которая может читать/писать статьи для отображения на сайте.

Я хочу сделать так, чтобы если статья доступна (прочитана) пользователем, то только для этого пользователя было указано, что статья была ранее доступна. Если я войду в совершенно новую учетную запись пользователя, та же статья не будет указана как "доступная" для новой учетной записи.

Как я могу реализовать это? Ниже приведены мои модели и представления

Модель пользователя

class User(AbstractBaseUser, PermissionsMixin):
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    email = models.EmailField(unique=True, max_length=255, blank=False)
    university = models.CharField(max_length=200, null=True, blank=True)
    newsletter_subscriber = models.BooleanField(default=False)
    is_email_verified = models.BooleanField(default=False)
    is_staff = models.BooleanField(
        default=False,
        help_text=(
            'Designates whether the user can log into '
            'this admin site.'
        ),
    )
    is_active = models.BooleanField(
        default=True,
        help_text=(
            'Designates whether this user should be '
            'treated as active. Unselect this instead '
            'of deleting accounts.'
        ),
    )
    date_joined = models.DateTimeField(default=timezone.now)
    objects = UserManager()
    USERNAME_FIELD = 'email'

    def __str__(self):
        return self.email

Модель статьи

class Article(models.Model):
    user = models.ForeignKey(
        User, on_delete=models.DO_NOTHING, null=True, blank=True)
    title = models.CharField(max_length=200, null=True, blank=False)
    author = models.CharField(max_length=200, null=True, blank=False)
    year = models.CharField(max_length=200, null=True, blank=False)
    journal = models.CharField(max_length=200, null=True, blank=False)
    description = models.TextField(null=True, blank=True)
    URL = models.CharField(max_length=200, null=True, blank=False)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

    class MetaData:
        ordering = ['-created']

Просмотр деталей статьи

class ArticleDetail(LoginRequiredMixin, DetailView):
    model = Article
    context_object_name = 'articles'
    template_name = 'home/article_detail.html'

Спасибо!

Вы можете создать дополнительную таблицу.

class ArticleSeenRecord(models.Model):
    user = models.ForeignKey("django.contrib.auth.models.User", on_delete=models.CASCADE)
    article = models.ForeignKey(Article, on_delete=models.CASCADE)

А затем в представлении статьи создайте новую запись, если таковой не существует, для этой статьи, объединенной с аутентифицированным пользователем.

class ArticleDetail(LoginRequiredMixin, DetailView):
    model = Article
    context_object_name = 'articles'
    template_name = 'home/article_detail.html'

    def get_object(self, queryset=None):
        obj =  super().get_object(queryset)
        record, created =  ArticleSeenRecord.objects.get_or_create(user=self.request.user, article=obj)
        return obj
    
Вернуться на верх