单个 django 查询集获取 n 个相邻项目

Posted

技术标签:

【中文标题】单个 django 查询集获取 n 个相邻项目【英文标题】:Single django queryset to get n adjacent items 【发布时间】:2015-11-13 03:37:37 【问题描述】:

我正在制作一个“无限”/连续滚动列表(如 twitter),并希望能够导航到特定项目。查找项目很简单,但我需要在它之前和之后获取一些项目。

我正在使用与此处建议的答案类似的方法:Getting next and previous objects in Django

before = list(reversed(models.MyModel.objects.filter(pk__lt=pk).order_by('-pk')[:10]))
after = list(models.MyModel.objects.filter(pk__gte=pk).order_by('pk')[:11])
objects = before + after

有没有办法将这些组合到一个查询中?

我不能简单地将两者与| 运算符结合起来,例如before | after 和没有list/reverse,因为切片必须先出现。我也不能做像pk__lt=pk+10, pk__gt=pk-10 这样的事情,因为对象可能会被删除。

举一个更复杂的例子,如果我是按主键以外的东西进行排序,我需要先用另一个查询来抓取对象:

object = get_object_or_404(models.MyModel, pk=pk)
before = list(reversed(models.MyModel.objects.filter(pk__lt=object.other_key).order_by('-other_key')[:10]))
after = list(models.MyModel.objects.filter(pk__gte=object.other_key).order_by('other_key')[:11])
objects = before + after

同样,是否有可能用一个查询来完成同样的事情?

【问题讨论】:

【参考方案1】:

我曾经遇到过类似的问题,并以described here 的方式解决了它:定义一个描述对象顺序的 SQL 变量,然后按此排序。但是,这是简单的 SQL。不知道有没有办法使用Django ORM。

【讨论】:

以上是关于单个 django 查询集获取 n 个相邻项目的主要内容,如果未能解决你的问题,请参考以下文章

Django - 如何为字段组合与查询集仅获取 2 个对象

Django在一页中合并查询集

使用反向关系在 django 模型中获取 n 个项目

检查两个 Django 查询集是不是有任何共同的项目

限制每组 n 个结果 - Django 查询集

在 django 中获取空查询集的类名