我正在为请求提出请求和投票功能:
class Request(models.Model):
title = models.CharField(max_length=255)
approved = models.BooleanField(default=False)
user = models.OneToOneField(User, on_delete=models.CASCADE)
class Vote(models.Model):
request = models.ForeignKey(Request, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
vote_type = models.BooleanField()
我想通过为每个请求减去不同的vote_type(True / False)来按降序排列总票数。意味着具有最高票数和最低票数的请求。
我可以通过这种方式点票:
Request.objects.order_by('-vote')
但这只是给了我哪个请求的外键数最多,而不是实际的投票数。
我可以获得这样的请求的实际投票数:
def get_vote_count(obj):
return obj.vote_set.filter(vote_type=True).count() - obj.vote_set.filter(vote_type=False).count()
但是在获取所有请求并在视图中对它们进行排序时,我无法弄清楚如何实现这一点。
答案 0 :(得分:3)
我认为你可以使用conditional expressions来实现它。
试试这个:
from django.db import models
Request.objects.annotate(
num_of_true_vote_type=models.Count(
models.Case(When(vote__vote_type=True, then=1), output_field=models.IntegerField())
),
num_of_false_vote_type=models.Count(
models.Case(When(vote__vote_type=False, then=1), output_field=models.IntegerField())
),
difference=models.F('num_of_true_vote_type') - models.F('num_of_false_vote_type')
).order_by('-difference')
答案 1 :(得分:0)
您可以将aggregation用于此
r = Request.objects.filter(approved=True, vote__vote_type=True).annotate(total_vote=Count('vote'))
这将为QuerySet
Request
提供approved=True
。 annotate
部分会为每个total_vote
个对象提供额外的归属Request
,其中包含Vote
所有相关vote_type=True
的值。
不要忘记它的QuerySet
,以便查看Vote
与vote_type=True
对于"第一个" Request
r.first().total_vote
BukuController