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. Для ваших следующих вопросов я настоятельно рекомендую поделиться моделями, с которыми вы работаете (или, по крайней мере, соответствующими их частями).