Django: как подсчитать рейтинги и отзывы о посте с помощью django?

У меня есть модель course и модель review and rating, которая позволяет пользователям оценивать определенный курс. теперь я хочу подсчитывать все оценки каждого курса при фильтрации. ПРИМЕЧАНИЕ: в детальном представлении курсов я придумал способ подсчета оценок следующим образом rating_count = CourseRating.objects.filter(course=course, rating__in=["3.0", "4.0", "5.0"]).count(). Это работает только в детальном представлении, потому что я сначала получаю курс, используя course = Course.objects.get(slug=course_slug).

Теперь я хочу подсчитать рейтинг в представлении списков курсов, как я могу это сделать, используя фильтр?

вот как выглядит детальное представление

@login_required
def course_details(request, course_slug):
    user = request.user
    course = Course.objects.get(slug=course_slug)
    reviews_count = CourseRating.objects.filter(active=True, course=course).count()
    rating_count = CourseRating.objects.filter(course=course, rating__in=["3.0", "4.0", "5.0"]).count()
    

вот как выглядит представление списка ПРИМЕЧАНИЕ: здесь я хочу подсчитать все оценки каждого курса

def index(request):
    courses = Course.objects.filter(course_publish_status="published").order_by('?')

То, что вы ищете, это Aggregation В документации есть несколько хороших (и быстрых) примеров того, как этого добиться. Вы хотите использовать .annotate с объектом Count. Судя по вашей фильтрации оценок, вы также хотите использовать параметр filter= объекта Count. Я также настоятельно рекомендую вам изучить, как правильно использовать Q() объект .

При всем том, пример достижения того, что вы ищете:

courses = Course.objects.filter(
    course_publish_status="published",
).annotate(
    rating_count=Count(
        'ratings', 
        filter=Q(ratings__rating__in=["3.0", "4.0", "5.0"])
    )
).order_by("?")

Помните, что я считал, что у вас есть related_name="ratings" на вашем ForeignKey. Для ваших следующих вопросов я настоятельно рекомендую поделиться моделями, с которыми вы работаете (или, по крайней мере, соответствующими их частями).

Вернуться на верх