为什么 django order_by 有重复

问题描述 投票:0回答:2

我写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')
有重复!为什么会出现这种情况??

python django
2个回答
2
投票

如果多部电影具有相同的

hotrank
,则无法保证
ORDER BY hotrank
中的真实顺序。尝试向
order_by()
子句添加附加字段:

Movie.objects.filter(id__in=set(list)).order_by('hotrank', '-id')

0
投票

这似乎是一个已知问题,如下所述: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]
© www.soinside.com 2019 - 2024. All rights reserved.