Как я могу найти, сколько 1 звезды/2 звезды ---- 5 звезд присутствует в процентах?

Я создал форму для хранения рейтинги и отзывы в базе данных. Рейтинги и отзывы отлично сохраняются в базе данных. Но проблема в том, что я не могу узнать, сколько различных типов звезд рейтинга присутствует в базе данных. Как узнать, сколько 1 звезда/2 звезды/---5 звезд присутствует в объектной модели в процентах? Что я должен делать?

модели.py:

class Frontend_Rating(models.Model):
    USer = models.ForeignKey(User,default=None,on_delete=models.CASCADE, related_name="frontend_rating")
    Rating = models.IntegerField(null=True)
    Feedback = models.TextField(max_length=250, null=True)

    def __str__(self):
        return str(self.pk)+ str(".") + str(self.USer) + str("(") + str(self.Rating) + str("stars") +str(")")

Просмотры.py:

def index(request):
    
    #rating____________________
    frontend_all_ratings = Frontend_Rating.objects.all()
    number_of_frontend_rating = frontend_all_ratings.count()
    average_rating = 0

    frontend_one_star = 0
    frontend_two_star = 0
    frontend_three_star = 0
    frontend_four_star = 0
    frontend_five_star = 0

    percentage_frontend_ONE_star = 0
    percentage_frontend_FIVE_star = 0


    for frontend_rating_item in frontend_all_ratings:
        frontend_rating = frontend_rating_item.Rating

        if frontend_rating:
            total_ratings = 0
            total_ratings += frontend_rating
            average_rating = round(total_ratings/frontend_all_ratings.count(),1)

        
    context = {
        "frontend_five_star":frontend_five_star,
        "frontend_one_star":frontend_one_star,
        "total_ratings":total_ratings,
        "average_rating":average_rating,
    }
    return render(request,'0_index.html',context)
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
0
26
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

number_of_frontend_rating = Frontend_Rating.objects.count()

# Divide value by overall count to get ratio and multiply ratio by 100 to get percentage
frontend_one_star = (Frontend_Rating.objects.filter(Rating=1).count() / overall_count)*100
frontend_two_star = (Frontend_Rating.objects.filter(Rating=2).count() / overall_count)*100
frontend_three_star = (Frontend_Rating.objects.filter(Rating=3).count() / overall_count)*100
frontend_four_star = (Frontend_Rating.objects.filter(Rating=4).count() / overall_count)*100
frontend_five_star = (Frontend_Rating.objects.filter(Rating=5).count() / overall_count)*100

Пожалуйста, поправьте меня, если я неправильно понял ваш вопрос

да работает

Mossaddak 22.04.2022 22:50
Ответ принят как подходящий

Вы можете получить данные с помощью одного запроса:

from django.db.models import Avg, BooleanField, ExpressionWrapper, Q

data = Frontend_Rating.objects.aggregate(
    frontend_one_star=Avg(ExpressionWrapper(Q(Rating=1), output_field=BooleanField())),
    frontend_two_star=Avg(ExpressionWrapper(Q(Rating=2), output_field=BooleanField())),
    frontend_three_star=Avg(ExpressionWrapper(Q(Rating=3), output_field=BooleanField())),
    frontend_four_star=Avg(ExpressionWrapper(Q(Rating=4), output_field=BooleanField())),
    frontend_five_star=Avg(ExpressionWrapper(Q(Rating=5), output_field=BooleanField())),
)

frontend_one_star = data['frontend_one_star']
frontend_two_star = data['frontend_two_star']
frontend_three_star = data['frontend_three_star']
frontend_four_star = data['frontend_four_star']
frontend_five_star = data['frontend_five_star']

или для баз данных, использующих целочисленное деление, например :

from django.db.models import Count, FloatField, Q

data = Frontend_Rating.objects.aggregate(
    frontend_one_star=Count('pk', filter=Q(Rating=1), output_field=FloatField()) / Count('pk', output_field=FloatField()),
    frontend_two_star=Count('pk', filter=Q(Rating=2), output_field=FloatField()) / Count('pk', output_field=FloatField()),
    frontend_three_star=Count('pk', filter=Q(Rating=3), output_field=FloatField()) / Count('pk', output_field=FloatField()),
    frontend_four_star=Count('pk', filter=Q(Rating=4), output_field=FloatField()) / Count('pk', output_field=FloatField()),
    frontend_five_star=Count('pk', filter=Q(Rating=5), output_field=FloatField()) / Count('pk', output_field=FloatField()),
)

frontend_one_star = data['frontend_one_star']
frontend_two_star = data['frontend_two_star']
frontend_three_star = data['frontend_three_star']
frontend_four_star = data['frontend_four_star']
frontend_five_star = data['frontend_five_star']

Note: Models in Django are written in PascalCase, not snake_case, so you might want to rename the model from Frontend_Rating to FrontendRating.


Note: normally the name of the fields in a Django model are written in snake_case, not PascalCase, so it should be: rating instead of Rating.

Другие вопросы по теме