Django:按组合的两列排序
我有以下疑问;有两列(dateEmploymentRD和dateTerminationRD) 我想用两个组合的coulmn(dateEmploymentRD和dateTerminationRD)对查询集进行排序 但我的查询是先按“DateEmploymentTRD”排序,然后按“dateTerminationRD”排序,如下所示 如何按组合的两列对查询进行排序 Edit-1:Added views.pyDjango:按组合的两列排序,django,django-queryset,Django,Django Queryset,我有以下疑问;有两列(dateEmploymentRD和dateTerminationRD) 我想用两个组合的coulmn(dateEmploymentRD和dateTerminationRD)对查询集进行排序 但我的查询是先按“DateEmploymentTRD”排序,然后按“dateTerminationRD”排序,如下所示 如何按组合的两列对查询进行排序 Edit-1:Added views.py def index(request): qsPersonnel = filterPe
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)
def索引(请求):
QSpersonal=过滤器人员(请求)
QSPersonalGraduateLevel=QSPersonal.values('graduateLevel',).annotate(Count('graduateLevel')).order_by()
QSPersonalTask=QSPersonal.values('task',).annotate(Count('task')).order_by()
qsPersonelgender=qsporterson.values('gender',).annotate(Count('gender')).order_by()
personnelDateMin=request.GET.GET('personnelDateMin')
personnelDateMax=request.GET.GET('personnelDateMax')
personnelDateMaxMin=dtt.strTime(personnelDateMin,%Y-%m-%d').date()
personnelDateMaxDate=dtt.strTime(personnelDateMax,%Y-%m-%d').date()
qsPersonnelsum=过滤器personnelsum(请求)
personnelChart={}
qsPersonnelsumbase=filterPersonnelsum(请求).aggregate(计数('id'))
b=qsPersonnelsumbase['id\u count']
personnelChart[personnelDateMin]=b
对于QSI人员:
如果i.dateTerminationRD和i.dateTerminationRDpersonnelDateMaxMin:
b+=1
人事记录[str(i.dateEmploymentRD)]=b
personnelchartsorded=dict(已排序(personnelChart.items()))
上下文={
“QSpersonal”:QSpersonal,
“qsPersonelgraduatelevel”:qsPersonelgraduatelevel,
“qsPersoneltask”:qsPersoneltask,
“qsPersonelgender”:qsPersonelgender,
}
返回呈现(请求'index.html',上下文)
要按两列中最早的一列排序,您必须添加一个注释,使用该注释计算两列中最早的一列,然后您可以按注释排序
import datetime
from django.db.models.functions import Least, Coalesce
qsPersonnel = qsPersonnel.annotate(
earliest=Coalesce(
Least('dateEmployementRD', 'dateTerminationRD'),
datetime.datetime.max
)
).order_by('earliest')
你说的“联合”是什么意思?你想按两者之差还是两者之和来排序?我的意思是:我有两个柜,我想订两个柜中最早的一个,先来。非常感谢。它正在工作,但由于有空行的提示,它并不完全正常。请查看附件中的图片。前3行不是“最早”订购。甚至我也尝试了
最伟大的
@Seckinyilmaz您使用哪种数据库?文件中确实提到了DBs之间的不一致行为this@Seckinyilmaz使用Coalesce
您应该能够获得正确的行为。更新了应答器,但命令不正确。空日期区域没有从旧到新排序:(您可以添加您的模型吗?看起来结果像字符串一样排序??
import datetime
from django.db.models.functions import Least, Coalesce
qsPersonnel = qsPersonnel.annotate(
earliest=Coalesce(
Least('dateEmployementRD', 'dateTerminationRD'),
datetime.datetime.max
)
).order_by('earliest')