Python Django Rest框架无序对象列表警告

bd1hkmkf  于 2022-12-24  发布在  Go
关注(0)|答案(8)|浏览(99)

我从Django 1.10.4升级到了1.11.1,在我运行测试的时候突然收到了大量的消息:

lib/python3.5/site-packages/rest_framework/pagination.py:208:
UnorderedObjectListWarning: 
Pagination may yield inconsistent results with an unordered object_list: 
<QuerySet [<Group: Requester>]>
paginator = self.django_paginator_class(queryset, page_size)

I've traced that back to the Django Pagination module: https://github.com/django/django/blob/master/django/core/paginator.py#L100
它似乎与我的queryset代码有关:

return get_user_model().objects.filter(id=self.request.user.id)

如何找到关于这个警告的更多细节?似乎我需要在每个过滤器的末尾添加一个order_by(id),但我似乎找不到哪个代码需要添加order_by(因为警告不返回堆栈跟踪,所以它在我的测试运行期间随机发生)。
谢谢!
编辑:
因此,通过使用@KlausD. verbosity tip,我查看了导致此错误的测试:
response = self.client.get('/api/orders/')
这将转到OrderViewSet,但get_queryset中的任何内容都不会导致它,序列化程序类中的任何内容都不会导致它。我有其他测试使用相同的代码来获取/api/orders,但这些测试不会导致它...... DRF在get_queryset之后做什么?
https://github.com/encode/django-rest-framework/blob/master/rest_framework/pagination.py#L166
如果我对分页进行回溯,那么我会得到一大堆与djangorest框架相关的东西,但是没有任何东西可以指出我的哪个查询触发了订单警告。

njthzxwz

njthzxwz1#

为了解决这个问题,我必须找到所有的alloffsetfilterlimit子句,并在其中添加一个order_by子句。

class Meta:
   ordering = ['-id']

在Django Rest框架的ViewSets(app/apiviews.py)中,我必须更新所有的get_queryset方法,因为添加默认排序似乎不起作用。

rkttyhzu

rkttyhzu2#

当我在我的www.example.com中使用objects.all()时,我收到此警告view.py

profile_list = Profile.objects.all()
paginator = Paginator(profile_list, 25)

为了解决这个问题,我改变了我的代码:

profile_list = Profile.objects.get_queryset().order_by('id')
paginator = Paginator(profile_list, 25)
ar5n3qh5

ar5n3qh53#

在我的例子中,我不得不添加order_by('id')而不是ordering

class IntakeCaseViewSet(viewsets.ModelViewSet):
    schema = None
    queryset = IntakeCase.objects.all().order_by('id')

Ordering需要在使用类 meta(而不是视图)的模型中。

yh2wf1be

yh2wf1be4#

让我给予你一个最新的答案...
https://code.djangoproject.com/ticket/6089
Django中User模型的默认顺序已经被移除,如果你是因为升级而出现在这个页面,很可能是因为这个改变。
您可能要处理的此问题有两个版本。
1.您自己的型号在其Meta中没有默认顺序(请参阅已接受的答案)
1.您正在使用的模型来自您用作依赖项的应用程序,该依赖项没有默认顺序
因为Django User模型本身并不遵守顺序,所以很明显,第二种情况不能通过让依赖项的维护者使用默认顺序来解决。好吧,现在你要么重写模型,不管你做什么(有时候是个好主意,但不适合解决这样的小问题)。
所以你只能在视图级别上解决这个问题,你还需要做一些事情来处理你所应用的排序过滤器类,为此,设置视图的ordering参数。

class Reviewers(ListView):
    model = User
    paginate_by = 50
    ordering = ['username']

另请参见Is there Django List View model sort?

yvgpqqbh

yvgpqqbh5#

另一个选项是添加OrderingFilter
http://www.django-rest-framework.org/api-guide/filtering/#orderingfilter

l7wslrjt

l7wslrjt6#

包括这个对我不起作用。

class Meta:
   ordering = ['-id']

但是修改**get_queryset(self)并用.order_by('id ')**对列表进行排序确实有效。可能是因为我使用了过滤器,我不知道

class MyView(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MySerializerSerializer

    def get_queryset(self):
        user = self.request.user
        return MyModel.objects.filter(owner=user).order_by('id')
p4tfgftt

p4tfgftt7#

改为更新模型 meta类。

class UsefulModel(models.Model):
    
    class Meta:
        ordering='-created' # for example

您仍然可以根据AlanSE之前的建议,从视图属性“ordering”覆盖排序。

class UsefulView(ListView):
    ordering = ['-created']
bvn4nwqk

bvn4nwqk8#

在我的例子中,它需要一个元组,而这个元组必须包含一个逗号,即使您只解析其中的一个项。

class Meta:
      ordering = ('-name',)

相关问题