как подсчитать рейтинг в django каркасе отдыха - PullRequest
0 голосов
/ 12 марта 2020

У меня есть такая модель

class UserRating(models.Model):
    product = models.OneToOneField(Product, on_delete=models.CASCADE, null=True)
    rate = models.PositiveSmallIntegerField()
    status = models.BooleanField(default=False)

Я оцениваю ее в диапазоне от 1 до 4, где 4 отлично, 3 очень хорошо, 2 хорошо, 1 плохо, и я должен получить подсчет рейтинга в соответствии с номером, данным пользователем. Я использую SerializerMethodField, как это

def get_excellent(self, obj):
    return models.UserRating.objects.filter(rate=4, status=True).count()


def get_very_good(self, obj):
    return models.UserRating.objects.filter(rate=3, status=True).count()


def get_good(self, obj):
    return models.UserRating.objects.filter(rate=2, status=True).count()

def get_bad(self, obj):
    return models.UserRating.objects.filter(rate=1, status=True).count()

, но это плохая идея, потому что четыре раза она попадает в БД. Я ищу лучший способ сделать это. Есть ли помощь, пожалуйста!

Заранее спасибо!

1 Ответ

1 голос
/ 12 марта 2020

Во-первых, лучше использовать варианты в вашей модели, если ваши значения предопределены

class UserRating(models.Model):
    RATE_CHOICES = (
        (4, "excellent"),
        (3, "very good"),
        (2, "good"),
        (1, "bad"),
    )
    product = models.OneToOneField(Product, on_delete=models.CASCADE, null=True)
    rate = models.PositiveSmallIntegerField(choices=RATE_CHOICES)
    status = models.BooleanField(default=False)

и ваш запрос для подсчета оценок таков:

from django.db.models import Count

rate_count_dict = UserRating.objects.values('rate').annotate(rate_count=Count('rate'))

вы можете просто назначить rate_count_dict в контекст вашего сериализатора и доступ к нему в вашем сериализаторе

...