我写django Restframework
我使用 set 来确保数字只出现一次
def hot_movie(self, request, *args, **kwargs):
print set(list) #set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 40, 41, 42, 59, 61, 64, 65, 68, 70, 71, 73, 76, 77])
self.queryset = Movie.objects.filter(id__in=set(list)).order_by('hotrank','-releaseday')
return super(MovieList, self).get(request, *args, **kwargs)
但是在 django order_by() 之后,有一个重复的,
是因为分页器吗??
它在一个页面中显示 10 个结果。
在第 2 页中,id=77 再次出现
请帮我!!我被困了很多天了。
我尝试
Movie.objects.filter(id__in=set(list)).order_by('-releaseday')
不会重复
但是Movie.objects.filter(id__in=set(list)).order_by('hotrank')
有重复!为什么会出现这种情况??
如果多部电影具有相同的
hotrank
,则无法保证ORDER BY hotrank
中的真实顺序。尝试向 order_by()
子句添加附加字段:
Movie.objects.filter(id__in=set(list)).order_by('hotrank', '-id')
这似乎是一个已知问题,如下所述:https://github.com/encode/django-rest-framework/issues/6886
解决方案似乎是将主键添加到排序中,正如 oxan 在该线程中所建议的那样:
from rest_framework.filters import OrderingFilter
# Work around DRF issue #6886 by always adding the primary key as last order field.
class StableOrderingFilter(OrderingFilter):
def get_ordering(self, request, queryset, view):
ordering = super(StableOrderingFilter, self).get_ordering(request, queryset, view)
pk = queryset.model._meta.pk.name
if ordering is None:
return (pk, )
return list(ordering) + [pk]