gpt4 book ai didi

django - 按外键字段而不是外键计数对对象进行排序

转载 作者:行者123 更新时间:2023-12-04 12:39:15 30 4
gpt4 key购买 nike

我正在为该请求提出请求和投票功能:

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()

我想通过为每个请求减去不同的投票类型(真/假),按总投票数以降序排列请求。意思是从最高票数到最低票数的订单请求。

我可以通过这种方式投票订购:
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()

但是在获取所有请求并在 View 中对它们进行排序时,我无法弄清楚如何实现这一点。

最佳答案

我认为您可以通过使用 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')

关于django - 按外键字段而不是外键计数对对象进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49791229/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com