【问题标题】:Django merge querysets in one pageDjango在一页中合并查询集
【发布时间】: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 个没有特色

标签: django django-rest-framework django-forms pagination django-queryset


【解决方案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_featuredqueryset_non_featuredqueryset_combined)的结果。希望这将为问题所在提供线索。
  • @FlipperPA 我认为他希望每个页面都显示 5 个特色和 15 个非特色,但不知何故要分页。
  • @FlipperPA 这就是我想要的,但我似乎无法让它工作
猜你喜欢
  • 2012-12-20
  • 2013-02-22
  • 2017-12-04
  • 2021-11-10
  • 2017-03-09
  • 1970-01-01
  • 2013-03-13
  • 2016-05-09
  • 2017-11-30
相关资源
最近更新 更多