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

Django:用户友好结果的高效半随机排序?,django,django-models,Django,Django Models,我有一个Django搜索应用程序,它有一个Postgres后端,里面装满了汽车。我的脚本是按品牌加载的:假设一个典型的组合是50辆克莱斯勒、100辆雪佛兰和1500辆福特,按这个顺序加载 默认顺序是按创建日期: class Car(models.Model): name = models.CharField(max_length=500) brand = models.ForeignKey(Brand, null=True, blank=True) transmission = mo

我有一个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\u added
订购的),这不是一个好的体验

我想确保品牌在早期结果中的分布尽可能均匀,没有一个品牌的大“运行”。对于如何实现这一点,有什么聪明的建议吗

我唯一的想法是:

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


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

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

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


然后,我使用该字段按排序

('name',brand')
排序如何?…虽然与随机排序没有太大区别,但从某种意义上说,它不会将少数品牌放在结果列表的更高位置-因此用户可能仍然会看到前20个结果并认为“所有这些都是福特的”。这是一个非常简单的建议。一种方法是将查询集结果随机化-
importrandom;x=[[i]表示范围内的i(len(qs))];random.shuffle(x)
-我正在考虑不进行预处理的方法,或者,如果您想要一致的排序,您可以按品牌对查询集进行排序,然后通过切片对元素进行重新排序。这就是您开始使用Solr,然后对结果进行镶嵌和加权的地方。:)我今天想到了这一点,得出的结论是,搜索应该按名称顺序显示所有内容,并且从用户体验的角度来看,篡改的搜索结果页面不是预期的行为,因此我认为您从一开始就做到了。
results = Cars.objects.filter(transmission="automatic", color="red").order_by("?")