prosource

Python Django Rest Framework 순서가 지정되지 않은 ObjectList 주의

probook 2023. 9. 5. 20:37
반응형

Python Django Rest Framework 순서가 지정되지 않은 ObjectList 주의

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)

저는 그것을 장고 페이지 모듈까지 추적했습니다: https://github.com/django/django/blob/master/django/core/paginator.py#L100

제 쿼리 세트 코드와 관련이 있는 것 같습니다.

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

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

감사합니다!

편집:

그래서 @KlausD를 사용함으로써.자세한 설명, 다음 오류를 유발하는 테스트를 살펴봤습니다.

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

이 작업은 다음 작업으로 진행됩니다.OrderViewSet그러나 get_queryset의 어떤 것도 원인이 되지 않으며 serializer 클래스의 어떤 것도 원인이 되지 않습니다.같은 코드를 사용하여 /api/order를 가져오는 다른 테스트가 있지만, 이 테스트는 원인이 되지 않습니다.get_queryset "DRF" 이후에 ?

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

페이지에 추적을 다시 넣으면 장고레스트 프레임워크와 관련된 많은 정보를 얻을 수 있지만 어떤 쿼리가 주문 경고를 트리거하는지 알려주는 것은 없습니다.

그래서 이것을 고치기 위해 저는 모든 것을 찾아야 했습니다.all,offset,filter,그리고.limit과 절및을 합니다.order_by그들에 대한 조항.일부는 기본 주문을 추가하여 수정했습니다.

class Meta:
   ordering = ['-id']

for Framework.py ViewSets for Django Rest Framework(app/apiviews.py )를 .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)

제 경우에는, 추가해야 했습니다.order_by('id')ordering.

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

Ordering클래스 메타(View가 아님)를 사용하여 모델에 있어야 합니다.

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

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

의 기본 User모델이 장고에서 제거되었습니다.업그레이드 때문에 이 페이지에 있는 경우 이 변경 사항과 연결되어 있을 가능성이 높습니다.

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

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

말 그대로 장고 이후로User모델 자체는 순서를 따르지 않습니다. 두 번째 시나리오는 이러한 종속성의 유지 관리자에게 기본 순서를 지정하도록 요청하여 해결할 수 없습니다.좋습니다. 이제 어떤 작업에 사용되는 모델을 재정의해야 합니다(가끔은 좋은 아이디어이지만 이러한 사소한 문제를 해결하는 데는 좋지 않습니다).

따라서 보기 수준에서 이 문제를 해결할 수 있습니다.또한 적용한 모든 주문 필터 클래스에 적합한 작업을 수행하려고 합니다.이를 위해 보기를 설정합니다.ordering매개 변수

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

Django List View 모델 정렬도 참조하십시오.

다른 옵션은 다음을 추가하는 것입니다.OrderingFilter

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

이것을 포함하는 것은 나에게 효과가 없었습니다.

class Meta:
   ordering = ['-id']

그러나 get_queryset(자체)을 변경하고 .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')

대신 모델 메타 클래스를 업데이트합니다.

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

이전에 AlanSE에서 조언한 대로 보기 속성 'ordering'에서 순서를 재정의할 수 있습니다.

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

내 경우에는 튜플이 필요하며 항목을 구문 분석할 때에도 해당 튜플에 쉼표가 포함되어야 합니다.

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

언급URL : https://stackoverflow.com/questions/44033670/python-django-rest-framework-unorderedobjectlistwarning

반응형