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 статей?
Подскажите пожалуйста варианты реализации данной функции, или может подход правильный, но я делаю что-то не так?
  • Вопрос задан
  • 497 просмотров
Решения вопроса 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()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы