2016-08-29 80 views
0

我有一个排序Django的查询集使用Python列表

Model Car(self.Models) 
# a bunch of features here 

然后在我的views.py,我让所有的汽车并计算他们的分数:

allCars = Car.object.all() # so you get [A, B, C, D] 
scoreList = someComputation(allCars) # returns [3,1,2,4] 

然后在我的模板我遍历所有的车辆来显示它们;使用排序查询返回与我得到主键排序,因此

  1. 一个
  2. Ç
  3. d

不过,我想知道是否有一种方法使用在视图中计算的列表来订购查询集,这将产生

  1. Ç
  2. 一个
  3. d

所以做这样的事情

allCars.order_by(scoreList) 
+0

那是一个随机排序,或者是特定的自定义排序?如果是这样,逻辑是什么? – karthikr

+0

在我的特殊情况下,根据模型中的特征进行特定排序(更好的安全等级增加了分数,减少燃料效率,等等)。我在这里使用汽车作为一个通用示例。同样的问题代表其他顺序,虽然随机我知道你可以只是order_by('?') – XenoChrist

+0

如果你需要一个很好的答案,你需要更具体的你正在寻找什么。例如,你会排序的一些示例标准,等等。 – karthikr

回答

2

首先,要回答你的问题,你不能使用ORM/SQL整理东西这是从具有复杂逻辑的记录中派生出来的,除非它只是纯粹的数学运算,而数据库可以在某种程度上做到这一点。

你的下一个选择是使用python构建排序。但是,您无法使用“全力以赴”和“全力吐出”功能对项目进行排序,这意味着您的当前功能正在采用整个列表并计算得分并返回所有得分,因为您失去了对应于哪辆车。

我会用模型上的函数来计算分数,然后记录相应的分类:

class Car(models.Model): 
    @property 
    def compute_score(self): 
     return a_score_based_on_current_car 

cars = Car.objects.all() 
cars = sorted(cars, key=lambda car: car.compute_score) 
+0

我明白了。如果赋值得分值的逻辑也取决于其他表中包含的记录,那么我唯一的选择是将查询集提取到python列表中,并在将它传递给模板之前进行排序?我认为这对我有意义。 – XenoChrist

+1

是的,我很害怕,我提供的方法可以在任何python列表中完成。这只是因为你没有根据数据库字段进行排序,所以你不能利用数据库排序的力量,这可能会让事情变得更慢。但是,如果这是你唯一的选择,那么蟒蛇排序是下一个最好的事情。 –

+0

这对我来说是公平的权衡。 – XenoChrist