如何从Django QuerySet中获取最新消息和最早消息

时间:2019-04-01 21:46:28

标签: python django django-models django-views django-queryset

在我的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)

1 个答案:

答案 0 :(得分:1)

解决此错误的方法是仅在尚未切片的查询集上使用latest()earliest()(以及first()last()(例如使用queryset[:5]获得前五条记录。您objList似乎已经被切片,然后再传递给函数。

如果您的查询集的记录顺序正确(意味着最早和最新的记录是第一和最后),则您还有两个选择:

  1. 使用其他三个查询来获取第一条记录和最后一条记录:
earliest = objList[0]
latest = objList[objList.count()]
  1. 实例化查询集中的对象(对此执行调用len)。然后,您可以访问第一个和最后一个项目,而无需其他查询:
latest = objList[len(objList)-1]
earliest = objList[0]

这仅需要一个查询,但是它将查询集中的所有对象加载到内存中。

要重复一遍,这仅在查询集被排序为earliestlatest为首和末尾的情况下才有效。否则,您必须定义单独的查询集。