Django在一页中合并查询集
Posted
技术标签:
【中文标题】Django在一页中合并查询集【英文标题】:Django merge querysets in one page 【发布时间】:2021-01-24 00:27:59 【问题描述】:在 django rest 框架中,我在模型上使用 20 的分页。 现在我想制作一个查询集,它需要 5 个项目,其中特色字段为真。 其他 15 个应该是特征字段为 false 的项目。
有人知道如何进行这项工作吗?
permission_classes = [AllowAny]
serializer_class = JobSerializer
pagination_class = Pagination
order_types =
1: 'job_order', #by randomized job order
2: '-created_date', #newest to oldest
3: 'created_date', #oldest to newest
4: 'name', #by name A -> Z,
5: '-name' #by name Z -> A,
def get_queryset(self):
requirements = self.request.query_params.getlist('requirements', None)
order_param = self.request.query_params.get('order_by', 1)
#make querysets
queryset_featured = Job.objects.all().filter(active=True, featured=True).order_by(self.order_types[int(order_param)])
queryset_non_featured = Job.objects.all().filter(active=True, featured=False).order_by(self.order_types[int(order_param)])
return queryset.distinct()
【问题讨论】:
您只想按精选内容排序? @JamesLin 我想做 2 个查询集,1 个有特色,1 个没有。 20 页的每一页我都希望有 5 个有特色,另外 15 个没有特色 【参考方案1】:使用两个独立查询的联合:
https://docs.djangoproject.com/en/3.1/ref/models/querysets/#union
这将允许您使用 [0:5]
对特色项目进行一次 ORM 查询,然后与 [0:15]
联合到非特色项目的 ORM 查询。
我没有对此进行测试,但这是您的代码示例:
queryset_featured = Job.objects.all().filter(active=True, featured=True).order_by(self.order_types[int(order_param)])[0:5]
queryset_non_featured = Job.objects.all().filter(active=True, featured=False).order_by(self.order_types[int(order_param)])[0:15]
queryset_combined = queryset_featured.union(queryset_non_featured)
for row in queryset_combined:
print(row)
【讨论】:
我很难理解如何用我自己的代码做到这一点:在上面添加了它。你能给我一个我必须在我的代码中编辑的示例吗? 试过了,还是不行。仍然是两者的混合......虽然我希望前 5 个有特色,其余的没有每个页面都有特色 下一步,我将在命令行中分别查看所有三个查询集(queryset_featured
、queryset_non_featured
和 queryset_combined
)的结果。希望这将为问题所在提供线索。
@FlipperPA 我认为他希望每个页面都显示 5 个特色和 15 个非特色,但不知何故要分页。
@FlipperPA 这就是我想要的,但我似乎无法让它工作以上是关于Django在一页中合并查询集的主要内容,如果未能解决你的问题,请参考以下文章