2012-10-23 49 views
4

我有一个由(id,rank)组成的字典。我想对id执行一个Django查询,这样生成的查询集按rank(降序)排序。如何通过外部值对Django QuerySet进行排序?

获取查询集很简单:

rankings = {...} 
result = MyModel.objects.filter(id__in=rankings.keys()) 

好像答案应该包括某种形式的注解,我可以作为ORDER_BY的一部分使用,但我无法弄清楚如何到达那里。

编辑:我忽略提到,我需要的结果是一个QuerySet,因为这是一个tastypie API管道的一部分。

+0

我不认为你可以做到这一点。如何将这些值存储在字段中? – dannyroa

+0

等级在每个查询上发生变化。应用程序正在查看一组学校,并根据表达的偏好为用户排名。 –

回答

0

我想办法解决这个问题的唯一方法是创建一个与主模型相关的新排名模型。在每个查询中,我将排名项插入到该模型中,然后能够通过关系执行order_by。 (使用注释将排名添加到学校记录。)

class UserSchoolRanking(models.Model): 
    user = models.ForeignKey(User) 
    school = models.ForeignKey(School) 
    rank = models.IntegerField() 

bulk_user_school_rank = [UserSchoolRank(user=user, school_id=k, rank=v) 
             for k, v in rankings.iteritems()] 
UserSchoolRank.objects.bulk_create(bulk_user_school_rank) 

schools = School.objects.filter(userschoolrank__user=user)\ 
       .annotate(rank=Min('userschoolrank__rank'))\ 
       .order_by('-userschoolrank__rank') 
2

是这样的吗?

rankings = { 1 : 2, 2: 1, ... } # i.e. { 'id' : 'ranking', ... } 
objects = list(MyModel.objects.filter(id__in=rankings.keys())) 
objects.sort(key=lambda obj: rankings[obj.id]) 
+1

有趣的解决方案。这种类型有多贵? – dannyroa

+0

这就是想法,但是对QuerySet没有“排序”方法,所以我不认为这个代码有效。 –

+0

我编辑了代码 - 您可以将QS转换为“List”,但它意味着立即评估QS。我不确定排序的效率,但我不确定是否有替代解决方案(当然,根据我所知,不涉及“Queryset”API) –

相关问题