我有一个带有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完美融合。
有关如何实现用户友好订购的任何想法?我被卡住了。
答案 0 :(得分:0)
我最终做的是在模型上添加priority
字段,并为其指定一个半随机整数。
半随机,我的意思是在特定范围内随机:对于雪佛兰和克莱斯勒来说是1-100,对于福特来说是1-500。
然后我将该字段用于order_by
。