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
모델이 장고에서 제거되었습니다.업그레이드 때문에 이 페이지에 있는 경우 이 변경 사항과 연결되어 있을 가능성이 높습니다.
이 문제에는 두 가지 버전이 있습니다.
- 사용자 자신의 모델에는 기본 순서가 없습니다.
Meta
(승인된 답변 참조) - 기본 순서가 없는 종속성으로 사용 중인 앱의 모델을 사용하고 있습니다.
말 그대로 장고 이후로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
'prosource' 카테고리의 다른 글
보기에 대한 쿼리를 빠르게 수행할 수 있도록 보기를 캐시하는 방법이 있습니까? (0) | 2023.09.05 |
---|---|
웹 페이지의 실시간 데이터를 구현하는 방법 (0) | 2023.09.05 |
Powershell 환경 PATH가 시스템 환경 PATH와 다른 이유는 무엇입니까? (0) | 2023.09.05 |
MySQL에서 잘못된 문자열 값 오류가 발생함 (0) | 2023.09.05 |
MySQL에서 타임스탬프할 문자열 (0) | 2023.09.05 |