gpt4 book ai didi

python - Django:将计算应用于查询集

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:59:06 26 4
gpt4 key购买 nike

我有一个 QuerySet,我希望将其传递给通用 View 以进行分页:

links = Link.objects.annotate(votes=Count('vote')).order_by('-created')[:300]

这是我的“热门”页面,其中列出了我的 300 个最新提交(10 页,每页 30 个链接)。我现在想通过 HackerNews 使用的算法对这个 QuerySet 进行排序:

(p - 1) / (t + 2)^1.5
p = votes minus submitter's initial vote
t = age of submission in hours

现在,因为在整个数据库上应用此算法的成本非常高,所以我只满足于最后 300 次提交。我的网站不太可能成为下一个 digg/reddit,因此虽然可扩展性是一个优点,但它是必需的。

我现在的问题是如何遍历我的 QuerySet 并按上述算法对其进行排序?

有关更多信息,这是我适用的模型:

class Link(models.Model):
category = models.ForeignKey(Category, blank=False, default=1)
user = models.ForeignKey(User)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
url = models.URLField(max_length=1024, unique=True, verify_exists=True)
name = models.CharField(max_length=512)

def __unicode__(self):
return u'%s (%s)' % (self.name, self.url)

class Vote(models.Model):
link = models.ForeignKey(Link)
user = models.ForeignKey(User)
created = models.DateTimeField(auto_now_add=True)

def __unicode__(self):
return u'%s vote for %s' % (self.user, self.link)

注意事项:

  1. 我没有“否决票”,所以只有投票行的存在表示特定用户的投票或特定链接。

编辑

我想我一直在把事情复杂化并发现了一段漂亮的小代码:

links = Link.objects.annotate(votes=Count('vote')).order_by('-created')[:300]
for link in links:
link.popularity = ((link.votes - 1) / (2 + 2)**1.5)

但对于我来说,我无法将其转换为我的模板:

{% for link in object_list %}
Popularity: {{ link.popularity }}
{% endfor %}

为什么不显示?我知道流行是有效的,因为:

print 'LinkID: %s - Votes: %s - Popularity: %s' % (link.id, link.votes, link.popularity)

返回我在控制台中期望的内容。

最佳答案

如果可能的话,您可以从 QuerySet 中创建一个值字典或值列表,并将您的排序算法应用于获得的字典(列表)。见

http://docs.djangoproject.com/en/dev/ref/models/querysets/#values-fields

http://docs.djangoproject.com/en/dev/ref/models/querysets/#values-list-fields

示例

# select links
links = Link.objects.annotate(votes=Count('vote')).order_by('-created')[:300]
# make a values list:
links = links.values_list('id', 'votes', 'created')
# now sort
# TODO: you need to properly format your created date (x[2]) here
list(links).sort(key = lambda x: (x[1] - 1) / (x[2] + 2)^1.5)

关于python - Django:将计算应用于查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2799198/

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