Python Django Rest Framework UnorderedObjectListWarning

前端 未结 7 2114
时光取名叫无心
时光取名叫无心 2021-01-30 15:47

I upgraded from Django 1.10.4 to 1.11.1 and all of a sudden I\'m getting a ton of these messages when I run my tests:

lib/python3.5/site-packages/rest_framework/         


        
相关标签:
7条回答
  • 2021-01-30 16:02

    In my case, I had to add order_by('id') instead of ordering.

    class IntakeCaseViewSet(viewsets.ModelViewSet):
        schema = None
        queryset = IntakeCase.objects.all().order_by('id')
    
    0 讨论(0)
  • 2021-01-30 16:05

    Let me give an answer updated to new developments...

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

    The default ordering of the User model has been removed in Django. If you found yourself at this page because of an upgrade, it's very likely connected to this change.

    There are 2 versions of this problem you might be dealing with.

    1. your own model does not have a default ordering in its Meta (see accepted answer)
    2. you are using a model from an app you are using as a dependency which does not have a default ordering

    Since literally the Django User model itself does not adhere to ordering, it's very clear that the second scenario cannot be resolved by asking the maintainers of those dependencies to put in a default ordering. Okay, so now you either have to override the model being used for whatever your doing (sometimes a good idea, but not good for addressing such a minor issue).

    So you're left with addressing it on the view level. You also want to do something that will play nicely with any ordering filter class you have applied. For that, set the view's ordering parameter.

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

    Also see Is there Django List View model sort?

    0 讨论(0)
  • 2021-01-30 16:09

    I was getting this warning when i used objects.all() in my view.py

    profile_list = Profile.objects.all()
    paginator = Paginator(profile_list, 25)
    

    to fix this i changed my code to :

    profile_list = Profile.objects.get_queryset().order_by('id')
    paginator = Paginator(profile_list, 25)
    
    0 讨论(0)
  • 2021-01-30 16:13

    Another option is to add OrderingFilter

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

    0 讨论(0)
  • 2021-01-30 16:16

    So in order to fix this I had to find all of the all, offset, filter, and limit clauses and add a order_by clause to them. Some I fixed by adding a default ordering:

    class Meta:
       ordering = ['-id']
    

    In the ViewSets for Django Rest Framework (app/apiviews.py) I had to update all of the get_queryset methods as adding a default ordering didn't seem to work.

    Hope this helps someone else. :)

    0 讨论(0)
  • 2021-01-30 16:16

    Including this didn't work for me.

    class Meta:
       ordering = ['-id']
    

    But changing get_queryset(self) and sorting the list with .order_by('id') did. Maybe worked because I'm using filters, I don't know

    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')
    
    0 讨论(0)
提交回复
热议问题