django 为什么我得到一个UnorderedObjectList警告,即使我遵循order_by()函数的常规用法?

js4nwp54  于 2023-05-30  发布在  Go
关注(0)|答案(1)|浏览(163)

我有一个通用的列表视图,我使用来自两个不同模型的查询集进行分页:消息和安全事务。
django终端输出在进入我的收件箱视图时给出以下警告:

**/usr/local/lib/python3.6/dist-packages/django/views/generic/list.py:88:UnorderedObjectListWarning:分页可能会产生与无序object_list不一致的结果:QuerySet. allow_empty_first_page=allow_empty_first_page,kwargs)

这是View和get_context_data方法:

### Inbox list class
class InboxListView(ListView):

#This view lets the user view all the messages created in a list

model = Message
template_name = "myInbox/inbox.html"
paginate_by = 3 # paginating twice here 
#so the page gets paginated in a convenient way for my template.

def get_context_data(self, **kwargs):
    message_list = Message.objects.filter(recipient=self.request.user)
    .order_by('-date')
    safeTransaction_list = SafeTransaction.objects
        .filter(trans_recipient=self.request.user)
        .order_by('-date') 
    queryset = list(chain(message_list, safeTransaction_list))
    #paginator setup start
    paginator = Paginator(queryset,3)
    page = self.request.GET.get('page')
    safe_T_list = paginator.get_page(page) #iterable list for template
    #paginator setup done
    context = super(InboxListView, self).get_context_data(**kwargs)
    context.update({
        'now': timezone.now(),
        'message_list':safe_T_list,
    })
    return context

我在这个方法中所做的是将过滤后的查询集链接到一个列表中,然后将其分页为一个查询集。问题是,即使在我这样做之前,我的过滤消息和安全交易被视为无序列表。这让我很困惑,因为order_by()在django网站上的典型用法与我所做的类似。
总之,我想使用从不同对象库构建的查询集进行分页,但我的过滤对象被认为是无序的,原因我不明白。
堆栈跟踪:

Starting development server at http://127.0.0.1:4200/
Quit the server with CONTROL-C.
[17/Dec/2018 07:52:52] "GET / HTTP/1.1" 200 1490
[17/Dec/2018 07:52:52] "GET /static/css/mystyle.css HTTP/1.1" 200 1555
[17/Dec/2018 07:52:52] "GET /static/css/w3pro.css HTTP/1.1" 200 15672
[17/Dec/2018 07:52:52] "GET /static/css/w3.css HTTP/1.1" 200 23293
[17/Dec/2018 07:52:52] "GET /static/favicon.ico HTTP/1.1" 200 8192
/usr/local/lib/python3.6/dist-packages/django/views/generic/list.py:88: UnorderedObjectListWarning: Pagination may yield inconsistent results with             an unordered object_list: <class 'account.models.Message'> QuerySet.
  allow_empty_first_page=allow_empty_first_page, **kwargs)
[17/Dec/2018 07:52:58] "GET /inbox HTTP/1.1" 200 3134
[17/Dec/2018 07:52:58] "GET /static/css/mystyle.css HTTP/1.1" 200 1555
5lwkijsr

5lwkijsr1#

我知道这是晚了,但如果有人遇到这个警告前进。您需要理解UnorderedObjectListWarning只是提醒您注意,对QuerySet的每次调用都不会返回相同的结果,因为对象列表没有排序。
因此,要摆脱此警告,您只需使用模型上定义的有效DateTimeField字段(如created_atupdated_at)对对象列表进行正确排序,就像我在下面的示例模型上一样,或者如果您使用DRF,您也可以定义OrderingFilter。如果你对此感兴趣,可以看看这个Stackoverflow answer
如果我有一个这样的模型:

from django.db import models

class InboxList(models.Model):
    user = models.ForeignKey(User, related_name='user_list', on_delete=models.CASCADE)
    url = models.CharField(max_length=1000)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

我可以很容易地按用户进行过滤(您可以使用任何模型字段进行过滤),并按上面在InboxList模型上定义的created_atupdated_at对对象列表进行排序。因此,覆盖get_queryset(),修复将是:

def get_queryset(self):
return InboxList.objects.filter(user=self.request.user).order_by("-created_at")

基本上,解决方案是使用在模型上定义的有效DateTimeField字段对对象列表进行排序。

相关问题