Каков наилучший способ получить список любимых статей по тегам для данного пользователя в django - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть вопрос. Допустим, у нас есть следующие модели:

model User:
    pass

model Article:
    text, ...
    tags = ManyToMany(Tag)

model Tag:
    id, name, ...

model Visits:
    hour = Integer(number of hours since epoch)
    article = ForeignKey(article)
    counter = IntegerField()

В локальном хранилище моего клиента у меня есть массив с любимыми тегами клиента.

Мой вопрос: каков наилучший способ запроса статьи по следующим критериям:

  • Первыми должны появиться те, которые связаны с любимыми тегами клиента.
  • Затем, Остальные статьи должны быть без повторения любимые
  • Соответственно, они должны быть упорядочены по «горячей стоимости», которая является суммой счетчика 24 последних моделей, связанных с каждой статьей

Я положил на свой Мысли для ДНЕЙ пытались придумать эффективное решение, но лучшее, чего я достиг, - это целые секунды, чтобы запросить с набором данных 10.

Пожалуйста, помогите.

Кроме того, выкл. -topi c, правильно ли я использовал выражение «наденьте (свою) мыслящую шапку»? Английский sh не мой основной язык, и я все еще учусь!

1 Ответ

0 голосов
/ 18 апреля 2020

Использование аннотаций

горячее значение: hot_value = Sum(visits_set__count,filter=Q(hour__gte= <one day ago>))

принадлежит тегам пользователя: user_tags = Count(tags__name__in=<user tags: List[str]>)

использование аннотаций: Article.objects.annotate(hot_value=hot_value).annotate(user_tags=user_tags).order_by(-user_tags, -hot_value)

Это вернет статьи, в которых сначала будет найдено больше тегов; если вы просто хотите использовать любой тэг / без тэга, вы можете использовать аннотацию 'Case'. Обратите внимание, что если вы хотите вернуть все результаты, и производительность является проблемой, вы можете переместить некоторую сторону логики c python, чтобы уменьшить загрузку ЦП вашей базы данных.

...