我有以下型号
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_added& count_votes,很容易用dishes.order_by(' - count_votes')和dishes.order_by(' - date_added')实现,第三种是“趋势排序”,我基本上想要将菜肴排列为一种随着时间的推移,upvotes的功能,任何想法我怎么能这样做?
答案 0 :(得分:1)
听起来你正在寻求实施“趋势”算法。
有很多关于这个主题的文章,你不是第一个提出这个问题的人。查看this和this,明确考虑使用一些预先构建的软件包,我发现django-trending和django-voting可能会对您有所帮助。
修改强>
Django允许使用注释进行复杂排序,但这仅限于内置聚合函数,如Avg,Sum等(您可以阅读here的方法)。因此,没有特定于django的方法来使用自定义方法进行订购。
但是,这并不意味着你不能用python做到这一点:
sorted(Dishes.objects.all(), key=lambda x: x.trending_method())
我不能说它将如何与大型数据库相提并论,但这是除了使用原始SQL之外我唯一知道的方式(这也是一个可选的,虽然令人厌烦的解决方案)。希望有所帮助!