我有一个通用的列表视图,我使用来自两个不同模型的查询集进行分页:消息和安全事务。
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
1条答案
按热度按时间5lwkijsr1#
我知道这是晚了,但如果有人遇到这个警告前进。您需要理解
UnorderedObjectListWarning
只是提醒您注意,对QuerySet的每次调用都不会返回相同的结果,因为对象列表没有排序。因此,要摆脱此警告,您只需使用模型上定义的有效
DateTimeField
字段(如created_at
或updated_at
)对对象列表进行正确排序,就像我在下面的示例模型上一样,或者如果您使用DRF,您也可以定义OrderingFilter。如果你对此感兴趣,可以看看这个Stackoverflow answer。如果我有一个这样的模型:
我可以很容易地按用户进行过滤(您可以使用任何模型字段进行过滤),并按上面在
InboxList
模型上定义的created_at
或updated_at
对对象列表进行排序。因此,覆盖get_queryset()
,修复将是:基本上,解决方案是使用在模型上定义的有效
DateTimeField
字段对对象列表进行排序。