在我的django应用中,有几种不同的方法可以获取相同模型的QuerySet对象。
我想使用一个函数来呈现数据-一直很好,直到我决定增加最早和最新时间来显示列表顶部。
这是我最近的尝试:
def render_list(request, objList):
latest = earliest = None
if objList:
latest = objList.latest('time').time
earliest = objList.earliest('time').time
context = {'objList': objList,
'earliest': earliest,
'latest': latest,
}
return render(request, 'list.html', context)
这会产生错误消息:
TypeError: Cannot reverse a query once a slice has been taken.
有没有办法解决这个问题?
更多详细信息:
render_list
中的多个视图函数正在调用函数views.py
,例如:
def list_all(request):
objList = MyTable.objects.order_by('ip')
return render_list(request,objList)
def detail(request, ip, group):
objList = MyTable.objects
try:
item = MyTable.objects.get(ip=ip)
# display the details page...
except MyTable.DoesNotExist:
objList = MyTable.objects.complex_filter(...)
# more code
# ...
return render_list(request, objList)
和urls.py
path('list', views.list_all)
path('<group>/<ip>', views.detail)
答案 0 :(得分:1)
解决此错误的方法是仅在尚未切片的查询集上使用latest()
和earliest()
(以及first()
和last()
(例如使用queryset[:5]
获得前五条记录。您objList
似乎已经被切片,然后再传递给函数。
如果您的查询集的记录顺序正确(意味着最早和最新的记录是第一和最后),则您还有两个选择:
earliest = objList[0]
latest = objList[objList.count()]
len
)。然后,您可以访问第一个和最后一个项目,而无需其他查询:latest = objList[len(objList)-1]
earliest = objList[0]
这仅需要一个查询,但是它将查询集中的所有对象加载到内存中。
要重复一遍,这仅在查询集被排序为earliest
和latest
为首和末尾的情况下才有效。否则,您必须定义单独的查询集。