Платформа отдыха Python Django UnorderedObjectListWarning

Я обновил от 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, но ничто, что указывает назад, какому из моих запросов инициировал предупреждение порядка.

62
задан 18 May 2017 в 01:49

4 ответа

Таким образом, для фиксации этого, я должен был найти весь из all, offset, filter, и limit пункты и добавить order_by пункт им. Некоторые я зафиксировал путем добавления упорядочивания по умолчанию:

class Meta:
   ordering = ['-id']

В ViewSets для Django Rest Framework (app/apiviews.py) я должен был обновить все из эти get_queryset методы как добавление, что упорядочивание по умолчанию, казалось, не работало.

Hope это помогает кому-то еще. :)

92
ответ дан 31 October 2019 в 13:52

Я получал это предупреждение, когда я использовал 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)
30
ответ дан 31 October 2019 в 13:52

Позвольте мне дать ответ, обновленный новым разработкам...

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

упорядочивание по умолчанию User модель была удалена в Django. При нахождении на уровне этой страницы из-за обновления она очень вероятно подключена к этому изменению.

существует 2 версии этой проблемы, с которой Вы могли бы иметь дело.

  1. Ваша собственная модель не имеет упорядочивания значения по умолчанию в Meta (см. принятый ответ)
  2. Вы используете модель из приложения, которое Вы используете в качестве зависимости, которая не имеет значения по умолчанию, заказывая

С тех пор буквально, сама модель Django User не придерживается упорядочивания, очень ясно, что второй сценарий не может быть разрешен путем просьбы, чтобы специалисты по обслуживанию тех зависимостей вставили упорядочивание по умолчанию. Хорошо, поэтому теперь Вы любой должен переопределить модель, используемую для что Ваше выполнение (иногда хорошая идея, но не хороший для того, чтобы решить такую незначительную проблему).

, Таким образом, Вас оставляют с обращением к нему на уровне представления. Вы также хотите сделать что-то, что будет играть приятно с любым классом фильтра упорядочивания, который Вы применили. Для этого, устанавливает представление ordering параметр.

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

Также видят , там вид модели List View Django?

1
ответ дан 31 October 2019 в 13:52

Другая опция состоит в том, чтобы добавить OrderingFilter

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

4
ответ дан 31 October 2019 в 13:52

Другие вопросы по тегам:

Похожие вопросы: