progammist
progammistJan. 1, 2021, 5:44 p.m.

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

django, rating

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

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

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

{{user.comments.count}}

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

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

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

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

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

5
Илья Чичак
  • Jan. 2, 2021, 8:52 a.m.

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

    progammist
    • Jan. 3, 2021, 9:30 a.m.
    • (edited)

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

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

    def user_ratings (request):
        user = request.user
        count_of_posts = user.bookmarkarticle_set.count()
        titles = {
            range(1, 10): 'Кошка',
            range(10, 20): 'Собака',
            range(20, 30): 'Слон'
            # add more titles
        }
        user_title = ''
        for key in titles:
            if count_of_posts in key:
                user_title = titles[key]
        return render(request, 'user.html', {'user': user,
                                             'user_title': user_title})
    

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

      Илья Чичак
      • Jan. 4, 2021, 4:23 a.m.
      In [1]: def user_rating(user):
         ...:     titles = {
         ...:     range(0, 10): '1',
         ...:     range(10, 20): '2'
         ...:     }
         ...:     for key, name in titles.items():
         ...:         if user.c in key:
         ...:             return name
         ...: 
      
      In [2]: class U:
         ...:     def __init__(self, c):
         ...:         self.c = c
         ...: 
      
      In [3]: user_rating(U(5))
      Out[3]: '1'
      

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

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

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

        progammist
        • Jan. 4, 2021, 9:39 a.m.
        • (edited)

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

        {{user.comments.count}}
        
          Илья Чичак
          • Jan. 4, 2021, 12:55 p.m.
          • (edited)

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

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

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

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

          я имел в виду:

           def profile_view(request, ...):
              ...
              user_rating = get_user_rating(user)
              ...
              return render(request, ..., {'user_rating': user_rating, ...})
          

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

            Comments

            Only authorized users can post comments.
            Please, Log in or Sign up
            d
            • dsfs
            • April 26, 2024, 11:56 a.m.

            C ++ - Test 004. Pointers, Arrays and Loops

            • Result:80points,
            • Rating points4
            d
            • dsfs
            • April 26, 2024, 11:45 a.m.

            C++ - Test 002. Constants

            • Result:50points,
            • Rating points-4
            d
            • dsfs
            • April 26, 2024, 11:35 a.m.

            C++ - Test 001. The first program and data types

            • Result:73points,
            • Rating points1
            Last comments
            k
            kmssrFeb. 9, 2024, 2:43 a.m.
            Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            EVA
            EVADec. 25, 2023, 6:30 p.m.
            Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
            J
            JonnyJoDec. 25, 2023, 4:38 p.m.
            Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
            G
            GvozdikDec. 19, 2023, 5:01 a.m.
            Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
            Now discuss on the forum
            IscanderChe
            IscanderCheApril 30, 2024, 11:22 a.m.
            Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…
            G
            GarApril 22, 2024, 12:46 p.m.
            Clipboard Как скопировать окно целиком в clipb?
            DA
            Dr Gangil AcademicsApril 20, 2024, 2:45 p.m.
            Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
            a
            a_vlasovApril 14, 2024, 1:41 p.m.
            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
            Павел Дорофеев
            Павел ДорофеевApril 14, 2024, 9:35 a.m.
            QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь

            Follow us in social networks