Django:高效的半随机order_by用户友好的结果?

时间:2013-07-19 14:11:59

标签: django django-models

我有一个带有Postgres后端的Django搜索应用程序,其中包含汽车。我的脚本逐个品牌加载:假设一个典型的组合是50个克莱斯勒,100个Chevys和1500个Fords,按顺序加载。

默认排序是创建日期:

class Car(models.Model):
  name = models.CharField(max_length=500)
  brand = models.ForeignKey(Brand, null=True, blank=True)
  transmission = models.CharField(max_length=50, choices=TRANSMISSIONS) 
  created = models.DateField(auto_now_add=True)
  class Meta:
      ordering = ['-created']

我的问题是:通常当用户进行搜索时,例如红色自动搜索,并且假设返回所有汽车的10%:

results = Cars.objects.filter(transmission="automatic", color="red")

用户通常在任何其他品牌之前首先获得数百个Fords(因为结果按date_added排序),这不是一个好的体验。

我希望确保品牌在早期结果中尽可能均匀分布,而不是一个品牌的大量“运行”。有关如何实现这一目标的任何聪明建议吗?

我唯一的想法是use the ? operator with order_by

results = Cars.objects.filter(transmission="automatic", color="red").order_by("?")

这不太理想。它的价格昂贵。如果一些品牌比其他品牌更常见,那么它并不能保证良好的结果组合 - 所以在这里克莱斯勒和雪佛兰属于少数品牌,用户仍然可能会看到很多福特第一。理想情况下,我会在前50场比赛中展示所有克莱斯勒和Chevys,与Fords完美融合。

有关如何实现用户友好订购的任何想法?我被卡住了。

1 个答案:

答案 0 :(得分:0)

我最终做的是在模型上添加priority字段,并为其指定一个半随机整数。

半随机,我的意思是在特定范围内随机:对于雪佛兰和克莱斯勒来说是1-100,对于福特来说是1-500。

然后我将该字段用于order_by