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)
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经理用一点元类切割器来做到这一点.
如果需要查找按字段值排序的下一个和上一个对象,这些对象可以相等且这些字段不是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)
| 归档时间: |
|
| 查看次数: |
17915 次 |
| 最近记录: |