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

时间:2015-08-19 17:46:43

标签: python django django-queryset django-orm

我正在创建一个“无限”/连续滚动列表(如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 | afterlist / 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 个答案:

答案 0 :(得分:0)

我曾遇到过类似的问题并以described here的方式解决了这个问题:定义一个描述对象的SQL变量'订购,然后按顺序排序。但是,那是普通的SQL。我不知道是否有使用Django ORM的方式。