Как я могу выборочно отмечать книги, прочитанные пользователем во внешнем интерфейсе, если у меня есть общий набор данных книг и набор данных конкретных прочитанных книг?

#python #django

Вопрос:

У меня есть модель «Книги» в django, в которой хранится такая информация, как имя, автор и т. Д. (Здесь не имеет значения, просто упоминание для некоторого контекста). Я отображаю всю эту информацию с помощью пагинатора, и у каждого пользователя есть возможность пометить книги, которые он/она прочитал. Чтобы отметить их, я могу придумать, как создать другую модель под названием «BookStatus», в которую я вставляю новые записи каждый раз, когда пользователь читает книгу. Я также подумал об этом, потому что хочу сохранить дополнительную информацию, такую как время, в течение которого была прочитана книга, и сколько времени пользователь потратил на ее чтение. Однако я не могу понять, как на самом деле отобразить, что пользователь прочитал какую-то конкретную книгу рядом с названием книги, отображая ее во внешнем интерфейсе. Каков был бы самый простой способ сделать это?

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

Комментарии:

1. Просто добавьте множество полей в свою модель книг, что-то вроде read_by = models.ManyToManyField(User,blank=True,null=True) того, что вы можете проверить в шаблоне, если пользователь находится в read_by, это означает, что он читает эту книгу, иначе он ее не читал.

2. возьмем логическое поле . Например : has_read = модели. Логическое поле(по умолчанию=Flase) затем обновляет поле, когда пользователь читает книгу.

3. @mehedi извините, увидев ваши комментарии, я понял, что не могу этого сделать, потому что я также хочу сохранить некоторую дополнительную информацию. Отредактировал мой вопрос.

4. добавьте поле даты и времени(время открытия) и поле продолжительности(время чтения) в базу данных . когда пользователь открывает книгу, он отправляет запрос на публикацию в свой api, чтобы добавить время открытия . затем начните отсчет времени с помощью js . когда пользователь закрывает вкладку или завершает чтение, нажмите api для обновления на время

Ответ №1:

Я думаю, ты на правильном пути. Вот пример того, что вы можете сделать:

 class BookStatus(models.Model):  book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='book')  user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user')  read = models.BooleanField(default=False)  duration = models.DurationField(blank=True, null=True)  created = models.DateTimeField(auto_now_add=True)  modified = models.DateTimeField(auto_now=True)   def __str__(self):  return f"{self.user.username} is reading {self.book.name}"