我有一个字段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
开始?有什么方法吗?
答案 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')