Как найти «Среднее количество слов в комментариях для каждого блога»?
Вот мои модели:
from django.db import models
from django.conf import settings
from django.utils import timezone
class Blog(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)
def publish(self):
self.published_date = timezone.now()
self.save()
def __str__(self):
return f"{self.title}"
class Comment(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='comments')
blog = models.ForeignKey(Blog, on_delete=models.CASCADE, related_name='comments')
comment = models.TextField()
published_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return f"{self.comment}"
Я попробовал использовать annotate() с помощью
Blog.objects.annotate(avg_comment_length = Avg(Length(comments__comment)))
но Length() получает общее количество символов в комментарии, а не количество слов. Как можно модифицировать эту функцию, чтобы вычислить среднее количество слов в комментариях для каждого блога?
Это нелегко, отчасти потому, что нет четкого определения, что именно представляет собой слово.
«Умный» способ подсчета количества слов - подсчитать количество пробелов, а затем использовать это, так что с:
from django.db.models import Value
Blog.objects.annotate(
avg_comment_length=Avg(
Length('comments__comment')
- Length(Replace('comments__comment', Value(' '), Value('')))
+ 1
)
)