我有一个 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 个结果中展示所有克莱斯勒和雪佛兰,与福特很好地混合在一起。
关于如何实现用户友好的订购的任何想法?我被困住了。