Django 4.0. Обновление поля один раз в день
Здравствуйте, я новичок в Django и застрял. У меня есть модель Book, которая имеет целочисленное поле count, которое является количеством пользователей, которые имеют эту книгу в своем списке чтения. Пользователи могут добавить книгу в свой ReadList (поле many to many). Я хочу обновлять счетчик в модели книги раз в день... как мне это сделать?
Мы будем использовать это для отображения трендовых книг и рейтинга книг на основе количества пользователей.
Модель книги:
class Book(models.Model):
name = models.CharField(max_length=150, unique=True)
description = models.TextField()
user_count = models.IntegerField()
pages = models.IntegerField()
genres = models.ManyToManyField(Genre)
def __str__(self):
return self.name
ReadList Model:
class ReadList(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
readlist = models.ManyToManyField(Book, related_name='readlist', blank=True)
def __str__(self):
return self.user.username
Любая помощь будет оценена по достоинству, спасибо.
Django, к сожалению, не очень хорошо справляется с планированием. На самом деле вы можете генерировать эту информацию уже сейчас, через related_name, с тем преимуществом, что это будет в реальном времени!
Начнем с набора запросов для всех книг. Представьте, что вы поместили это в одно из ваших представлений.
books = Book.objects.all()
Теперь у вас есть все ваши книги, но нет данных о номерах книжных списков. Поэтому мы можем аннотировать эту информацию с помощью запроса
from django.db.models import Count
books = Book.objects.all().annotate(user_count = Count('readlist')
Полезно, но не в определенном порядке, давайте расположим их от высшего к низшему.
books = Book.objects.all().annotate(user_count = Count('readlist') .order_by('-user_count')
Но нужна ли она для каждой книги в магазине? Давайте ограничимся десятью лучшими.
books = Book.objects.all().annotate(user_count = Count('readlist') .order_by('-user_count')[:10]
Однако книги не обязательно знают свое собственное место в иерархии. Давайте пройдемся по ним и дадим им еще одно импровизированное поле (кверисеты не индексируются, поэтому мы можем сделать это сами)
for index, book in enumerate(books):
book.placing = index
Передайте context['books'] = books вашему шаблону, и вы должны быть в состоянии сделать следующее:
{% for book in books %}
Title:{{book.title}} <br>
Position:{{book.placing}} <br>
In :{{book.user_lists}} reading lists<br>
И вот он, актуальный список 10 лучших книг, отсортированных по количеству пользователей, без необходимости использования внешнего планирования. Убедитесь, что вы добавили palcing последним, так как любые дальнейшие запросы к БД по набору запросов приведут к переделке запроса.