IT Share you

Python Django Rest Framework 순서가 지정되지 않은 ObjectListWarning

shareyou 2020. 12. 7. 21:12
반응형

Python Django Rest Framework 순서가 지정되지 않은 ObjectListWarning


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)

Django Pagination 모듈로 다시 추적했습니다. https://github.com/django/django/blob/master/django/core/paginator.py#L100

내 쿼리 셋 코드와 관련된 것 같습니다.

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

이 경고에 대한 자세한 내용은 어떻게 찾을 수 있습니까? order_by(id)모든 필터 끝에 를 추가해야하는 것 같지만 order_by가 추가되어야하는 코드를 찾을 수없는 것 같습니다 (경고가 스택 추적을 반환하지 않으므로 테스트 중에 무작위로 발생하기 때문입니다. 운영).

감사!

편집하다:

따라서 @KlausD를 사용합니다. 자세한 정보,이 오류를 일으키는 테스트를 살펴 보았습니다.

response = self.client.get('/api/orders/')

이것은 이동 OrderViewSet하지만 get_queryset의 어떤 것도 원인이 아니며 serializer 클래스의 어떤 것도 원인이되지 않습니다. 동일한 코드를 사용하여 / api / orders를 가져 오는 다른 테스트가 있는데이 테스트가 발생하지 않습니다 .... get_queryset 후에 DRF가 수행하는 작업은 무엇입니까?

https://github.com/encode/django-rest-framework/blob/master/rest_framework/pagination.py#L166

페이지 매김에 트레이스 백을 넣으면 django rest 프레임 워크와 관련된 모든 것을 얻지 만 내 쿼리 중 주문 경고를 트리거하는 것을 가리키는 것은 없습니다.


그래서 내가 문제를 해결하기 위해 모든 찾아야했다 all, offset, filter,와 limit절을하고 추가 order_by그들에게 절을. 일부는 기본 순서를 추가하여 수정했습니다.

class Meta:
   ordering = ['-id']

Django Rest Framework (app / apiviews.py)의 ViewSets get_queryset에서 기본 순서를 추가하는 것이 작동하지 않는 것처럼 보이기 때문에 모든 메서드 를 업데이트 해야했습니다.

이것이 다른 사람에게 도움이되기를 바랍니다. :)


내 view.py에서 objects.all ()을 사용할 때이 경고를 받았습니다.

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

이 문제를 해결하기 위해 코드를 다음과 같이 변경했습니다.

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

또 다른 옵션은 OrderingFilter

http://www.django-rest-framework.org/api-guide/filtering/#orderingfilter


새로운 개발에 대한 업데이트 된 답변을 드리겠습니다 ...

https://code.djangoproject.com/ticket/6089

User모델 의 기본 순서는 Django에서 제거되었습니다. 업그레이드로 인해이 페이지를 찾은 경우이 변경 사항과 관련이있을 가능성이 큽니다.

이 문제에는 두 가지 버전이 있습니다.

  1. 자신의 모델에는 기본 주문이 없습니다 Meta(허용되는 답변 참조)
  2. 기본 순서가없는 종속성으로 사용중인 앱의 모델을 사용하고 있습니다.

말 그대로 Django User모델 자체는 순서를 따르지 않기 때문에 두 번째 시나리오는 이러한 종속성의 유지 관리자에게 기본 순서를 지정하도록 요청하여 해결할 수 없다는 것이 매우 분명합니다. 좋아, 이제 당신은 당신이하는 일에 사용되는 모델을 재정의해야합니다 (때로는 좋은 생각이지만 그런 사소한 문제를 해결하기에는 좋지 않습니다).

따라서 뷰 수준에서 문제를 해결해야합니다. 또한 적용한 정렬 필터 클래스와 잘 어울리는 작업을 수행하고 싶습니다. 이를 위해 뷰의 ordering매개 변수를 설정합니다 .

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

또한 Django List View 모델 정렬이 있습니까?를 참조하십시오 .


이것을 포함하면 나를 위해 일하지 않았습니다 = (.

class Meta:
   ordering = ['-id']

But worked changing get_queryset(self) and sorting the list with .order_by('id'). Maybe worked because im using filters, i dont now

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')

참고URL : https://stackoverflow.com/questions/44033670/python-django-rest-framework-unorderedobjectlistwarning

반응형