Как получить список телефонных номеров (12 телефонов) с наибольшим количеством голосов типа bad (django)

Я использую django и мне нужен запрос для получения списка телефонных номеров (12 телефонов) с условием Vote has type bad и list phone is most type vote is bad. Пожалуйста, помогите мне, как сделать запрос для получения списка телефонов с условиями, которые. Например: телефон 1 имеет 10 голосов плохо, телефон 2 имеет 1 голос плохо, телефон 3 имеет 5 голосов плохо, телефон 4 имеет 2 голоса плохо. list_phone_i_want_3_item = [phone 1, phone3, phone4] with [10 vote bad, 5 vote bad, 2 vote bad]

ниже представлены мои модели

   class Phone(models.Model):
        phone_number = models.TextField(max_length=15, verbose_name="phone", default="")
        view = models.IntegerField(default=1, verbose_name="view")
        create = models.DateTimeField(auto_now_add=True, verbose_name="create")
        status = models.BooleanField(default=True, verbose_name="status")
    
        def __str__(self) -> str:
            return self.phone_number

class Vote(models.Model):
    # type vote : 1 is Normal 
    # 2 is Spam
    # 3 is Bad
    type_vote = models.IntegerField(default=1, verbose_name="type vote")
    phone = models.ForeignKey(Phone,on_delete=models.CASCADE, related_name="phone")
    comment = models.TextField(verbose_name="comment")
    create = models.DateTimeField(auto_now_add=True, verbose_name="creat")
    status = models.BooleanField(default=True, verbose_name="status")

    def __str__(self) -> str:
        return self.comment

Вы можете перечислить двенадцать Phone, набравших наибольшее количество Bad голосов с:

from django.db.models import Count

Phone.objects.alias(
    count_bad=Count('phone', filter=Q(phone__type_vote=3))
).order_by('-count_bad')[:12]

или если вы хотите перечислить только Phone, которые имеют как минимум один плохой Vote, то это:

from django.db.models import Count

Phone.objects.filter(
    phone__type_vote=3
).alias(
    count_bad=Count('phone')
).order_by('-count_bad')[:12]

Note: The related_name=… parameter [Django-doc] is the name of the relation in reverse, so from the Phone model to the Vote model in this case. Therefore it (often) makes not much sense to name it the same as the forward relation. You thus might want to consider renaming the phone relation to votes.

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