django - Django:Order_by 组合了两列
问题描述
我有以下查询;有两列(dateEmploymentRD 和 dateTerminationRD)。
qsPersonnel = qsPersonnel.filter(Q(dateEmploymentRD__isnull=False),
Q(dateEmploymentRD__lte=personnelDateMax),
Q(dateTerminationRD__gte=personnelDateMin) | Q(dateTerminationRD__isnull=True),
Q(dateTerminationRD__lte=personnelDateMax) | Q(dateTerminationRD__isnull=True)).order_by('dateEmploymentRD','dateTerminationRD')
我想用两个组合(dateEmploymentRD 和 dateTerminationRD)对该查询集进行排序。
但我的查询首先订购“dateEmployementRD”,然后按“dateTerminationRD”订购,如下所示。
如何通过合并两列来排序我的查询?
编辑1:添加views.py
def index(request):
qsPersonnel = filterPersonnel(request)
qsPersonelgraduatelevel= qsPersonnel.values('graduateLevel',).annotate(Count('graduateLevel')).order_by()
qsPersoneltask = qsPersonnel.values('task',).annotate(Count('task')).order_by()
qsPersonelgender = qsPersonnel.values('gender',).annotate(Count('gender')).order_by()
personnelDateMin = request.GET.get('personnelDateMin')
personnelDateMax = request.GET.get('personnelDateMax')
personnelDateMaxMin = dtt.strptime(personnelDateMin,'%Y-%m-%d').date()
personnelDateMaxDate = dtt.strptime(personnelDateMax,'%Y-%m-%d').date()
qsPersonnelsum = filterPersonnelsum(request)
personnelChart = {}
qsPersonnelsumbase = filterPersonnelsum(request).aggregate(Count('id'))
b = qsPersonnelsumbase['id__count']
personnelChart[personnelDateMin] = b
for i in qsPersonnel:
if i.dateTerminationRD and i.dateTerminationRD < personnelDateMaxDate:
b -= 1
personnelChart[str(i.dateTerminationRD)] = b
elif i.dateEmploymentRD and i.dateEmploymentRD > personnelDateMaxMin:
b += 1
personnelChart[str(i.dateEmploymentRD)] = b
personnelChartSorted = dict(sorted(personnelChart.items()))
context ={
'qsPersonnel' : qsPersonnel,
'qsPersonelgraduatelevel' : qsPersonelgraduatelevel,
'qsPersoneltask' : qsPersoneltask,
'qsPersonelgender' : qsPersonelgender,
}
return render(request, 'index.html', context)
解决方案
要按两列中最早的排序,您必须添加一个注释,该注释使用计算两列中最早的一个Least
,然后您可以按注释排序
import datetime
from django.db.models.functions import Least, Coalesce
qsPersonnel = qsPersonnel.annotate(
earliest=Coalesce(
Least('dateEmployementRD', 'dateTerminationRD'),
datetime.datetime.max
)
).order_by('earliest')
推荐阅读
- java - WindowInsetListener 在 Android R (Api 30) 中将偏移量加倍
- java - 如何解决“序言中不允许内容”
- ssl - Celery/Redis 配置中的 SSL 认证 - keyfile、certfile 和 ca_certs
- javascript - 为什么 Cheerio 会在 webapp 中的本地开发机器上工作,但当 webapp 部署在 Heroku 上时却不行?
- java - updatechildren后viewModel更新的firebase实时数据库问题
- zurb-foundation - Foundation 6 向下钻取菜单:将返回事件添加到自定义按钮
- vue.js - 如何使用 v-for 为多个插槽创建插槽内容
- azure - 如何在 Azure 上更改网站的文化设置
- javascript - Javascript 对象正在覆盖自身
- php - 选择框并输入