Задать вопрос
BlackTrub
@BlackTrub
Костыль developer

Django учет просмотренных постов?

Здравствуйте!

Нужно реализовать учет просмотренных постов для каждого юзера, реализую так models.py:
class CountArticle(models.Model):
    user = models.OneToOneField(User)
    count = models.ManyToManyField(Article)

Добавил новую таблицу с связями между каждым юзером и статьями.
Данная инициализация у меня проходит тут context_processors.py:
def total_count(request):

    def init_count(request):
        #  add to CountArticle model Article list
        count = CountArticle.objects
        usr = request.user
        art = Article.objects.all()
        art_add = Article.objects
        count.create(user=usr)
        count = CountArticle.objects.get(user=usr)
        for x in art:
            count.count.add(art_add.get(article_title=x))
        return {"total_count": len(count.count.all()), }

    if request.user.is_authenticated():
        try:
            total = CountArticle.objects.get(user=request.user)
            return {"total_count": len(total.count.all()), }
        except ObjectDoesNotExist:
            return init_count(request)
    return {}

Суть проблемы: Я регистрирую пользователя, инициализация моих просмотренных статей происходит получается при первом запросе кол-ва, т.е. почти сразу после регистрации, и вот сейчас я добавил 20 статей и мне кажется что это всё сильно долго начинает обрабатываться, а если у меня будет 1000 статей?
Подскажите пожалуйста варианты реализации данной функции, или может подход правильный, но я делаю что-то не так?
  • Вопрос задан
  • 501 просмотр
Подписаться 4 Оценить 2 комментария
Решения вопроса 2
sim3x
@sim3x
sqlite - бд для разработки, на продакшене ее никто не ставит
Измерять на ней скорость, всерьез, не стоит

так
user = models.OneToOneField(User)
никто уже не делает
https://docs.djangoproject.com/en/1.9/topics/auth/...
techydiary.com/how-to-customize-user-model-in-django1-5

count = models.ManyToManyField(Article) название поля не отвечает содержимому

"инициализировать" м2м не нужно
Ответ написан
winordie
@winordie
Лучшая документация -- исходники
def total_count(request):
    if request.user.is_authenticated():
        total, created = CountArticle.objects.get_or_create(user=request.user)
        if created:
            total.count.add(*list(Article.objects.all()))
        return {"total_count": total.count.count(), }
    return {}

Думаю так будет короче.
Кроме того не надо использовать
len(count.count.all())
Правильно
count.count.count()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Strikt Москва
от 100 000 до 180 000 ₽
ITK academy Саратов
от 75 000 ₽
Sim-Ba Pay Санкт-Петербург
от 180 000 ₽