gpt4 book ai didi

python - Django 自定义 order_by 算法

转载 作者:行者123 更新时间:2023-12-04 07:47:09 25 4
gpt4 key购买 nike

我想为热门帖子创建一个公式。到目前为止,我已经这样做了:

def hot(request):
posts = Post.objects.all()
for post in posts:
likes = int(post.likes)
views = int(post.blog_view)
rep = int(post.author.profile.reputation)
d0 = timezone.now()
d1 = post.date_posted
days = (d0 - d1).days
trending_score = (3/(1+days**(1/3)))*(0.5*views+0.25*rep+2.5*likes)
该公式位于 Trending_score 变量中,每次都会返回一个数字作为其趋势得分。 Trending_score 越高,趋势越强。
现在我想在 django 中使用 order_by 或其他东西来实现这个:
def hot(request):
posts = Post.objects.all()
for post in posts:
likes = int(post.likes)
views = int(post.blog_view)
rep = int(post.author.profile.reputation)
d0 = timezone.now()
d1 = post.date_posted
days = (d0 - d1).days
trending_score = (3/(1+days**(1/3)))*(0.5*views+0.25*rep+2.5*likes)
context = {
Post.objects.all().order_by(-trending_score)
}
return render(request, 'blog/popularity.html', context)
我显然知道这行不通,因为我将 Trending_score 放在 for 循环中,而上下文在它之外,所以它行不通。错误是: Invalid order_by arguments: [-21.75]但我不知道我还能怎么做。任何帮助做到这一点将不胜感激。

最佳答案

您可以 annotate您的查询集具有由您的公式计算的值,然后根据注释对其进行排序。主要的事情是将您的公式转换为 Django ORM 理解的表示形式,以便它可以转换为正确的 SQL 语句。这样的事情应该工作:

from django.db.models import F, FloatField, DurationField
from django.db.models.functions import Cast, Now, Extract


days = Cast(
Extract(Cast(Now() - F('date_posted'), DurationField()), 'days'),
FloatField()
)
views = Cast('views', FloatField())
rep = Cast('post.author.profile.reputation', FloatField())
likes = Cast('likes', FloatField())

Post.objects.all().annotate(
trending_score=(3./(1+days**(1/3)))*(.5*views+.25*rep+2.5*likes)
).order_by('-trending_score')

关于python - Django 自定义 order_by 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67154011/

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