5

我今天在我的 django 控制台中尝试了这个,我得到了两个不同的结果。我认为这list.reverse()颠倒了列表(即第一个对象成为最后一个对象,依此类推)[1]。然而,情况似乎并非如此。

>>> from django.db.models import Q
>>> q1 = Q(result=1)
>>> q2 = Q(result=-1)
>>> q3 = q1 | q2
>>> form = UserData.objects.filter(user=user).filter(coins__gt=0).filter(q3).order_by('-modified', '-placed').values_list('result', flat=True)[:10]
>>> form
Out[14]: [-1, -1, -1, -1, -1, 1, -1, 1, -1, -1]
>>> form.reverse()
Out[15]: [1, 1, 1, 1, 1, 1, 1, -1, -1, -1]
>>> form_bw = []
>>> for f in reversed(form):
...     form_bw.append(f)
...     
>>> form_bw
Out[18]: [-1, -1, 1, -1, 1, -1, -1, -1, -1, -1]

我究竟做错了什么?显然我想要的是form_bw

[1] http://docs.python.org/tutorial/datastructures.html

4

5 回答 5

5

当你这样做

querysert.order_by('-modified', '-placed').reverse()

它实际上意味着

querysert.order_by('modified', 'placed')

因此,如果结果出乎意料,只需在 Python 中反转

list(reversed(values_list))

或者您必须检查reverse带到查询集的排序逻辑。

于 2012-05-01T08:24:02.480 回答
4

form不是一个列表。它是一个 QuerySet,它与列表有很多相似之处,但不是一个。特别是,它定义了一种reverse方法,该方法实际上返回数据库以相反的顺序请求项目。

于 2012-05-01T08:24:25.330 回答
3

真的form是清单吗?请注意,list.reverse它不会返回结果,因此您的提示结果看起来很可疑:

In [1]: lst = [1, 2, 3, 4]
In [2]: lst.reverse()    # <-- note: no result returned here (~ None)
In [3]: lst 
Out[3]: [4, 3, 2, 1]
In [4]:

另外,作为旁注,更好的使用方法reversed是:

In [5]: lst = [1, 2, 3, 4]

In [6]: rev = list(reversed(lst))

In [7]: rev
Out[7]: [4, 3, 2, 1]

或者,只需使用带有负步骤的切片:

In [8]: rev = lst[::-1]

In [9]: rev
Out[9]: [4, 3, 2, 1]
于 2012-05-01T08:13:15.953 回答
3

我不是 Django 专家,因此不确定类型form是什么。但是,很明显它不是标准列表:

>>> form.reverse()
Out[15]: [1, 1, 1, 1, 1, 1, 1, -1, -1, -1]

内置list.reverse()函数返回None,而这个reverse()函数似乎返回了不同的东西。这使我得出结论,这form不是一个列表。

尝试以下操作:

form = list(form)
form.reverse()

另请注意:

>>> form_bw = []
>>> for f in reversed(form):
...     form_bw.append(f)

只是很长的一段话:

>>> form_bw = list(reversed(form))
于 2012-05-01T08:13:30.703 回答
0

尽管这里的其他解决方案在大多数情况下都是正确的,但是使用 Django QuerySet 的 values_list,它不起作用。

唯一的办法是:

season_ids = matchesByLeague.values_list('season_id', flat=True).distinct()
season_ids = list(reversed(season_ids))

#Not working
#season_ids = matchesByLeague.values_list('season_id', flat=True).distinct()
#season_ids.reverse()
#season_ids = matchesByLeague.values_list('season_id', flat=True).distinct().reverse()
#reversed(list(season_ids))

感谢@NPE 和@xpanta

于 2018-09-01T09:52:13.927 回答