पायथन Django बाकी फ्रेमवर्क UnorderedObjectListWarning


88

मैंने 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 पृष्ठ पर अंक लगाना मॉड्यूल के लिए खोजा है: 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 जोड़ा गया है (क्योंकि चेतावनी स्टैक ट्रेस वापस नहीं करती है और इसलिए यह मेरे परीक्षण के दौरान यादृच्छिक रूप से होता है। Daud)।

धन्यवाद!

संपादित करें:

इसलिए @KlausD का उपयोग करके। वर्बोसिटी टिप, मैंने इस त्रुटि के कारण परीक्षण को देखा:

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

यह हो जाता है, OrderViewSetलेकिन get_queryset में कोई भी चीज़ इसका कारण नहीं बनती है और क्रमिक वर्ग में कुछ भी इसका कारण नहीं बनती है। मेरे पास अन्य परीक्षण हैं जो समान / कोड / ऑर्डर प्राप्त करने के लिए उसी कोड का उपयोग करते हैं और जो इसका कारण नहीं बनते हैं .... get__tsetset के बाद DRF क्या करता है?

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

यदि मैं पृष्ठांकन में एक ट्रेसबैक डालता हूं, तो मुझे django बाकी ढांचे से संबंधित सामान का एक पूरा गुच्छा मिलता है, लेकिन कुछ भी नहीं जो मेरे प्रश्नों को वापस इंगित करता है जो आदेश चेतावनी को ट्रिगर कर रहा है।


1
आमतौर पर परीक्षण के नाम से ढूंढना आसान होना चाहिए जो चेतावनी का कारण बनता है। आप वर्बोसिटी ( -v 2अधिकांश परीक्षण धावकों पर) के साथ परीक्षण चलाना चाह सकते हैं
क्लॉस डी।

धन्यवाद @KlausD यह एक सहायक अनुस्मारक है।
डेनिस माउल्डिन

1
प्रश्नों के लिए दिखता है, जहां आप एक कर रहे हैं offsetऔर limitलेकिन कोईorder_by
जिप्सी

साभार @gipsy मेरे पास उनमें से कोई भी नहीं है ....
डेनिस मौलदीन

जवाबों:


138

तो इस मैं ठीक करने के लिए सभी को खोजने के लिए किया था all, offset, filter, और limitखंड और एक जोड़ने order_byउन्हें खंड। कुछ मैंने डिफ़ॉल्ट ऑर्डर जोड़कर तय किया:

class Meta:
   ordering = ['-id']

Django रेस्ट फ्रेमवर्क (ऐप / एपिविसेज) के लिए व्यूसेट्स में मुझे सभी get_querysetतरीकों को अपडेट करना था क्योंकि डिफॉल्ट ऑर्डर जोड़ने से काम नहीं लगता था।

मनाइए कि यह किसी और के लिए सहायक हो। :)


2
बहुत बढ़िया, यह नहीं पता था कि DRF ऑर्डर करने के लिए भी मॉडल को पढ़ता है <3
अमीर सावन

मेरे पास अपने मॉडल में एक डिफ़ॉल्ट ऑर्डर है लेकिन मुझे अभी भी यह चेतावनी मिली है: |
एरियल

मेरी गलती। मेरे पास मूल श्रेणी में आदेश था, लेकिन मैं डॉक्स विशेषता को ओवरक्लॉकिंग के बिना ठीक से अधिलेखित कर रहा था, जैसा कि डॉक्स में वर्णित है , और बाल वर्ग 'मेटा में मेरे पास कोई आदेश नहीं था, इसलिए माता-पिता से मूल्य खो गया था।
एरियल

1
नोट है कि जोड़ने -में ordering = ['-id']आदेश अवरोही क्रम में आपकी क्वेरी।
एलरनड ने मोनिका

50

मुझे यह चेतावनी तब मिल रही थी जब मैंने अपने 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)

1
मुझे लगता है कि यह होना चाहिए Profile.objects.all().order_by('id').. कम से कम मेरे लिए यह काम करता है, अन्यथा मुझे मिलता हैAttributeError: type object 'Profile' has no attribute 'get_queryset'
राडटेक

9

मुझे नए घटनाक्रम के बारे में जवाब देने दें ...

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

UserDjango में मॉडल के डिफ़ॉल्ट ऑर्डर को हटा दिया गया है। यदि आपने अपग्रेड के कारण खुद को इस पेज पर पाया है, तो यह इस बदलाव से जुड़ा हुआ है।

इस समस्या के 2 संस्करण हैं जिनसे आप निपट सकते हैं।

  1. आपके स्वयं के मॉडल में इसका डिफ़ॉल्ट आदेश नहीं है Meta(स्वीकृत उत्तर देखें)
  2. आप एक ऐसे ऐप से एक मॉडल का उपयोग कर रहे हैं जिसे आप एक निर्भरता के रूप में उपयोग कर रहे हैं जिसमें डिफ़ॉल्ट ऑर्डर नहीं है

सचमुच Django के बाद से User मॉडल खुद ऑर्डर करने का पालन नहीं करता है, यह बहुत स्पष्ट है कि दूसरे परिदृश्य को उन निर्भरताओं के अनुरक्षकों को डिफ़ॉल्ट ऑर्डर में डालने के लिए कहकर हल नहीं किया जा सकता है। ठीक है, इसलिए अब आपको या तो आपके द्वारा किए जा रहे मॉडल को ओवरराइड करना होगा (कभी-कभी एक अच्छा विचार है, लेकिन इस तरह के मामूली मुद्दे को संबोधित करने के लिए अच्छा नहीं है)।

तो आप इसे दृश्य स्तर पर संबोधित करने से बचे हैं। आप कुछ ऐसा भी करना चाहते हैं जो आपके द्वारा लागू किए गए किसी भी फ़िल्टरिंग क्लास के साथ अच्छी तरह से खेलेंगे। उसके लिए, दृश्य के orderingपैरामीटर को सेट करें ।

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

यह भी देखें क्या वहाँ Django सूची दृश्य मॉडल सॉर्ट है?



1

मेरे मामले में, मुझे order_by('id')इसके बजाय जोड़ना था ordering

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

0

इसके बजाय मॉडल मेटा क्लास को अपडेट करें।

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

आप अभी भी AlanSE द्वारा पूर्व में दी गई दृश्य विशेषता 'आदेश' से आदेश को ओवरराइड कर सकते हैं ।

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

-2

इसमें मेरे लिए काम करना शामिल नहीं था।

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')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.