Как получить список телефонных номеров (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 thePhone
model to theVote
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 therelation tophone
votes
.