在忽略值的同时对查询集进行排序

时间:2015-01-14 11:33:27

标签: python django

我有一个字段hotrank,它保存热门音乐(1,2,3,4 ... 10)
但如果音乐没有进入前10名,我将节省0 我还有另一个名为releaseday的字段,用于保存音乐的发布日

现在我想查询:

 Music.objects.filter(releaseday__lte=today).order_by('hotrank','-releaseday') 

但这是一个问题,hotrank的order_by从0开始,但0不是顶级音乐
我怎样才能让order_by从hotrank=1开始?有什么方法吗?

3 个答案:

答案 0 :(得分:1)

我认为您可以使用查询结果中的hotrank = 0结果,如下所示:

Music.objects.filter(releaseday__lte=today).exclude(hotrank=0).order_by(
                     '-hotrank','-releaseday') 

如果您想在订购结果后添加hotrank = 0的结果,您可以这样做:

released_music = Music.objects.filter(releaseday__lte=today).order_by('-hotrank',
                                                                      '-releaseday')
result = released_music.exclude(hotrank=0) | released_music.filter(hotrank=0) 

答案 1 :(得分:0)

我不相信有办法通过Django查询实现这一目标。我也不鼓励您使用任何特定于数据库的查询。您可以从数据库中提取所有对象,并按照您希望的方式对它们进行排序:

music_list = Music.objects.filter(releaseday__lte=today).all()
sorted_music = sorted(music_list, key=lambda x: x.hotrank if x.hotrank > 0 else 11)

答案 2 :(得分:0)

将查询集的extra()方法与SQL CASE表达式一起使用:

Music.objects.filter(releaseday__lte=today) \
             .extra({'vrank': 'CASE WHEN hotrank=0 THEN 11 ELSE hotrank END'}) \
             .order_by('vrank','-releaseday')