Я обновил от 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:
]>
paginator = self.django_paginator_class(queryset, page_size)
Я проследил это до модуля Django Pagination: https://github.com/django/django/blob/master/django/core/paginator.py#L100
Это, кажется, связано с моим кодом queryset:
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 не вызывает его, и ничто в классе сериализатора не вызывает его. У меня есть другие тесты, которые используют тот же код для получения/api/orders, и они не вызывают его.... Что DRF делает после get_queryset?
https://github.com/encode/django-rest-framework/blob/master/rest_framework/pagination.py#L166
Если я поместил traceback в разбиение на страницы затем, я получаю целый набор материала, связанного с платформой отдыха django, но ничто, что указывает назад, какому из моих запросов инициировал предупреждение порядка.
Таким образом, для фиксации этого, я должен был найти весь из all
, offset
, filter
, и limit
пункты и добавить order_by
пункт им. Некоторые я зафиксировал путем добавления упорядочивания по умолчанию:
class Meta:
ordering = ['-id']
В ViewSets для Django Rest Framework (app/apiviews.py) я должен был обновить все из эти get_queryset
методы как добавление, что упорядочивание по умолчанию, казалось, не работало.
Hope это помогает кому-то еще. :)
Я получал это предупреждение, когда я использовал 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)
Позвольте мне дать ответ, обновленный новым разработкам...
https://code.djangoproject.com/ticket/6089
упорядочивание по умолчанию User
модель была удалена в Django. При нахождении на уровне этой страницы из-за обновления она очень вероятно подключена к этому изменению.
существует 2 версии этой проблемы, с которой Вы могли бы иметь дело.
Meta
(см. принятый ответ) С тех пор буквально, сама модель Django User
не придерживается упорядочивания, очень ясно, что второй сценарий не может быть разрешен путем просьбы, чтобы специалисты по обслуживанию тех зависимостей вставили упорядочивание по умолчанию. Хорошо, поэтому теперь Вы любой должен переопределить модель, используемую для что Ваше выполнение (иногда хорошая идея, но не хороший для того, чтобы решить такую незначительную проблему).
, Таким образом, Вас оставляют с обращением к нему на уровне представления. Вы также хотите сделать что-то, что будет играть приятно с любым классом фильтра упорядочивания, который Вы применили. Для этого, устанавливает представление ordering
параметр.
class Reviewers(ListView):
model = User
paginate_by = 50
ordering = ['username']
Также видят , там вид модели List View Django?
Другая опция состоит в том, чтобы добавить OrderingFilter
http://www.django-rest-framework.org/api-guide/filtering/#orderingfilter