progammist
2 января 2021 г. 4:44

Как создать систему рейтингов

django, rating

Всем привет. Вопрос такой. У меня есть мини-блог и профили пользователей. На странице профилей пользователей я отображаю информацию:

Количество комментариев этого пользователя;
Количество постов этого пользователя;

Я отображаю количество комментариев в пользовательском профиле шаблона следующим образом:

{{user.comments.count}}

Хотелось бы сделать небольшую рейтинговую систему, например:

Если пользователь оставил 10 комментариев и 10 постов - он кот (слово рядом с username, например).
Если 20 - это собака (слово рядом с username, например).
30 - слон и др.

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

Как я могу это реализовать? Буду благодарен за любую помощь

2

Вам это нравится? Поделитесь в социальных сетях!

5
Илья Чичак
  • 2 января 2021 г. 19:52

я бы сделал кастомный queryset, в котором делал бы аннотацию count, а потом исходя из этого делал бы выводы
второй вариант - сделать функцию, которая бы делала count комментов, которые оставил этот пользователь, а потом исходя из этого возвращала бы константу его типов

    progammist
    • 3 января 2021 г. 20:30
    • (ред.)

    А как это можно привязать например к закаладкам? Закладки делал по статье

    Попробовал так:

    1. def user_ratings (request):
    2. user = request.user
    3. count_of_posts = user.bookmarkarticle_set.count()
    4. titles = {
    5. range(1, 10): 'Кошка',
    6. range(10, 20): 'Собака',
    7. range(20, 30): 'Слон'
    8. # add more titles
    9. }
    10. user_title = ''
    11. for key in titles:
    12. if count_of_posts in key:
    13. user_title = titles[key]
    14. return render(request, 'user.html', {'user': user,
    15. 'user_title': user_title})

    Но ничего не выводится. Если у вас есть время, не могли бы вы показать - как бы это реализовали вы?

      Илья Чичак
      • 4 января 2021 г. 15:23
      1. In [1]: def user_rating(user):
      2. ...: titles = {
      3. ...: range(0, 10): '1',
      4. ...: range(10, 20): '2'
      5. ...: }
      6. ...: for key, name in titles.items():
      7. ...: if user.c in key:
      8. ...: return name
      9. ...:
      10.  
      11. In [2]: class U:
      12. ...: def __init__(self, c):
      13. ...: self.c = c
      14. ...:
      15.  
      16. In [3]: user_rating(U(5))
      17. Out[3]: '1'

      у меня вот так получилось

      я бы сделал эту функцию отдельно и сделал бы ранний return - у вас будет перебираться весь словарь titles, хотя нужное значение может быть в самом начале

      а уже в представлении вызывал бы функцию

        progammist
        • 4 января 2021 г. 20:39
        • (ред.)

        Спасибо, вроде появляется понимание, а в предатвелнии вызывать функцию - это как (в плане синаксиса) ?)
        И еще, если я захочу привязать эту логику к количеству комментариев пользователя,то где мне указать comment.count ?
        Комментарии вывожу в шаблоне так:

        1. {{user.comments.count}}
          Илья Чичак
          • 4 января 2021 г. 23:55
          • (ред.)

          не, вы сейчас про шаблоны
          для шаблонов надо делать тэги (я бы использовал inclusion tag) - https://docs.djangoproject.com/en/3.1/howto/custom-template-tags/#inclusion-tags

          представления - это то, что

          1. def index_view(request):
          2. return render(...)

          но лучше вообще это не использовать - шаблоны оч медленно работают (если python код загружается в память, то шаблоны при каждом обращении ищутся и обрабатываются с нуля, а работа с файловой системой сильно медленнее, чем работа с оперативой памятью)

          я имел в виду:

          1. def profile_view(request, ...):
          2. ...
          3. user_rating = get_user_rating(user)
          4. ...
          5. return render(request, ..., {'user_rating': user_rating, ...})

          тоесть, вернуть эту функцию там, где надо

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь
            • Последние комментарии
            • IscanderChe
              12 апреля 2025 г. 17:12
              Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
            • AK
              1 апреля 2025 г. 11:41
              Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
            • Evgenii Legotckoi
              9 марта 2025 г. 21:02
              К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
            • VP
              9 марта 2025 г. 16:14
              Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
            • ИМ
              22 ноября 2024 г. 21:51
              Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…