Я обновился с 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 не вызывает этого, и ничто в классе сериализатора не вызывает этого. У меня есть другие тесты, которые используют тот же код для получения / api / orders, но не вызывают этого .... Что делает DRF после get_queryset?
https://github.com/encode/django-rest-framework/blob/master/rest_framework/pagination.py#L166
Если я помещаю трассировку в разбиение на страницы, я получаю целую кучу вещей, связанных с фреймворком django rest, но ничего, что указывает на то, какой из моих запросов вызывает предупреждение о порядке.
источник
-v 2
offset
а,limit
а нетorder_by
Ответы:
Поэтому для того , чтобы исправить это , я должен был найти все
all
,offset
,filter
иlimit
положений и добавитьorder_by
пункт к ним. Некоторые я исправил, добавив порядок по умолчанию:class Meta: ordering = ['-id']
В ViewSets для Django Rest Framework (app / apiviews.py) мне пришлось обновить все
get_queryset
методы, так как добавление порядка по умолчанию, похоже, не сработало.Надеюсь, это поможет кому-то другому. :)
источник
-
вordering = ['-id']
запрос упорядочивает ваш запрос в порядке убывания.Я получал это предупреждение, когда использовал 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)
источник
Profile.objects.all().order_by('id')
.. по крайней мере, это работает для меня, иначе я получуAttributeError: type object 'Profile' has no attribute 'get_queryset'
Позвольте мне дать обновленный ответ на новые события ...
https://code.djangoproject.com/ticket/6089
Порядок
User
модели по умолчанию был удален в Django. Если вы оказались на этой странице из-за обновления, скорее всего, это связано с этим изменением.Есть 2 версии этой проблемы, с которыми вы можете столкнуться.
Meta
(см. принятый ответ)Поскольку буквально сама
User
модель Django не подчиняется порядку, совершенно очевидно, что второй сценарий не может быть разрешен, если попросить разработчиков этих зависимостей установить порядок по умолчанию. Хорошо, теперь вам нужно либо переопределить используемую модель для того, что вы делаете (иногда это хорошая идея, но не подходит для решения такой незначительной проблемы).Итак, вам остается обратиться к нему на уровне представления. Вы также хотите сделать что-то, что будет хорошо работать с любым классом упорядочивающего фильтра, который вы применили. Для этого установите
ordering
параметр представления.class Reviewers(ListView): model = User paginate_by = 50 ordering = ['username']
Также см. Есть ли сортировка модели Django List View?
источник
Другой вариант - добавить
OrderingFilter
http://www.django-rest-framework.org/api-guide/filtering/#orderingfilter
источник
В моем случае мне пришлось добавить
order_by('id')
вместоordering
.class IntakeCaseViewSet(viewsets.ModelViewSet): schema = None queryset = IntakeCase.objects.all().order_by('id')
источник
Вместо этого обновите мета-класс модели.
class UsefulModel(models.Model): class Meta: ordering='-created' # for example
вы все еще можете переопределить порядок из атрибута представления 'ordering', как ранее рекомендовалось AlanSE .
class UsefulView(ListView): ordering = ['-created']
источник
В том числе и у меня это не сработало.
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')
источник