1

我有一个 Django 搜索应用程序,它的 Postgres 后端装有汽车。我的脚本是按品牌加载的:假设典型的混合是 50 辆克莱斯勒、100 辆雪佛兰和 1500 辆福特,按此顺序加载。

默认排序是按创建日期:

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")

用户通常先获得数百辆福特汽车,然后再获得任何其他品牌(因为结果按 排序date_added),这不是一个好的体验。

我想确保品牌在早期结果中尽可能均匀分布,而不是一个品牌的大“运行”。关于如何实现这一目标的任何巧妙建议?

我唯一的想法是使用 ? 运算符order_by

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

这并不理想。它的价格昂贵。如果某些品牌比其他品牌更常见,它并不能保证良好的结果组合 - 所以在克莱斯勒和雪佛兰占少数的情况下,用户仍然可能首先看到很多福特。理想情况下,我会在前 50 个结果中展示所有克莱斯勒和雪佛兰,与福特很好地混合在一起。

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

4

1 回答 1

0

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

半随机是指特定范围内的随机:雪佛兰和克莱斯勒为 1-100,福特为 1-500。

然后我用那个字段来order_by.

于 2013-07-22T17:33:57.273 回答