1

我有以下型号

class Dishes(models.Model):
    name = models.CharField(max_length=40, unique=True)
    date_added = models.DateTimeField(auto_now_add=True)
    #increment/decrement with upvote added or removed
    count_votes = models.IntegerField(blank=True, null=True, default=0)

class Upvotes(models.Model):
    dish = models.ForeignKey(Dishes)
    user = models.ForeignKey(User)
    date_added = models.DateTimeField(auto_now_add=True)

我有 3 种菜肴,前 2 种是按 date_add 和 count_votes,这很容易用 discs.order_by('-count_votes') 和 disc.order_by('-date_added') 来实现,第三种是“趋势排序” “我基本上想成为一种随着时间的推移将菜肴排名为赞成票的函数,知道我该怎么做吗?

4

1 回答 1

1

听起来您正在寻找实现“趋势”算法。

有很多关于这个主题的文章,你不是第一个问这个问题的人。查看thisthis,并明确考虑使用一些预构建的包,我发现django-trendingdjango-voting可能对你有帮助。

编辑

Django 允许使用 annotate 进行复杂排序,但这仅限于内置聚合函数,例如 Avg、Sum 等(您可以在此处阅读有关操作的信息)。因此,没有特定于 django 的方式来使用自定义方法进行排序。

然而,这并不意味着你不能用 python 做到这一点:

sorted(Dishes.objects.all(), key=lambda x: x.trending_method())

我不能说它在大型数据库中的表现如何,但这是我知道的除了使用原始 SQL 之外的唯一方法(这也是一个可选的,虽然令人厌烦的解决方案)。希望有帮助!

于 2013-09-30T09:57:55.653 回答