在Django中获取下一个和上一个对象

AAA*_*AAA 28 django django-views

我正在尝试获取漫画书问题的下一个和前一个对象.简单地更改ID号或过滤添加日期是行不通的,因为我没有按顺序添加问题.

这是我的视图设置的方式,它的工作原理prev_issue和返回前一个对象,但它返回最后一个对象next_issue,我不知道为什么.

def issue(request, issue_id):
issue = get_object_or_404(Issue, pk=issue_id)
title = Title.objects.filter(issue=issue)
prev_issue = Issue.objects.filter(title=title).filter(number__lt=issue.number)[0:1]
next_issue = Issue.objects.filter(title=title).filter(number__gt=issue.number)[0:1]
Run Code Online (Sandbox Code Playgroud)

Ste*_*yne 41

添加一个order_by子句以确保它按顺序排序number.

next_issue = Issue.objects.filter(title=title, number__gt=issue.number).order_by('number').first()
Run Code Online (Sandbox Code Playgroud)

  • 你不需要使用过滤器两次,你可以做`filter(title = title,number__gt = issue.number)` (3认同)
  • 您也应该对 prev_issue 查询执行此操作。很高兴能帮助你! (2认同)

Mic*_*ley 28

我知道这有点晚了,但对于其他任何人来说,django确实有更好的方法,请参阅https://docs.djangoproject.com/en/1.7/ref/models/instances/#django.db.models .Model.get_previous_by_FOO

所以这里的答案就是这样的

next_issue = Issue.get_next_by_number(issue, title=title)
Run Code Online (Sandbox Code Playgroud)

Django经理用一点元类切割器来做到这一点.

  • 请注意,这仅适用于非null DateField和DateTimeField. (5认同)
  • 由于原始链接已损坏而更新了链接:https://docs.djangoproject.com/en/3.1/ref/models/instances/#django.db.models.Model.get_previous_by_FOO (2认同)

Dam*_*nic 6

如果需要查找按字段值排序的下一个上一个对象,这些对象可以相等且这些字段不是Date*类型,则查询会稍微复杂,因为:

  • 对具有相同值限制的对象的排序[:1]将始终为多个对象产生相同的结果;
  • 对象本身可以包含在结果集中.

以下是查询集,它们还考虑了产生正确结果的主键(假设numberOP 中的参数不是唯一的并且省略了title参数,因为它与示例无关):

以前:

prev_issue = (Issue.objects
    .filter(number__lte=issue.number, id__lt=instance.id)
    .exclude(id=issue.id)
    .order_by('-number', '-id')
    .first())
Run Code Online (Sandbox Code Playgroud)

下一个:

next_issue = (Issue.objects
    .filter(number__gte=issue.number, id__gt=instance.id)
    .exclude(id=issue.id)
    .order_by('number', 'id')
    .first())
Run Code Online (Sandbox Code Playgroud)