我试图根据查询集的两个属性标记结果,这些属性属于另一个查询的两个阈值的每个组合。这是澄清的代码:
threshold_query = threshold.objects.all()
main_query = main.ojbects.values(
'Athreshold', 'Bthreshold'
).annotate(
Case(
When(
Q(Avalue__lte=threshold_query['Avalue'])
& Q(Bvalue__lte=threshold_query['Bvalue']),
then=Value(threshold_query['label'])
...
)
)
)
阈值的模型就像:
class threshold(models.Model):
Avalue = models.FloatField(default=0.1)
Bvalue = models.FloatField(default=0.3)
label = models.CharField(default='Accepted')
因此,有一个矩阵来决定标签,例如,如果有两个阈值{'avalue':0.4,'bvalue':0.6,'label':'sableed'} and'} and {avalue':0.7,'':0.7,'bValue':0.7,'label':接受}如果您演示了水平轴上的途径(命名矩阵的行)和垂直轴上的bValues(命名矩阵的列),则该值的组合决定了这两个阈值的组合将被"接受"或"被拒绝"的单元格中。是否可以使用一个查询来获得我心中的内容?我的目的是最大程度地减少由于数据的巨大性而导致的查询数量。
在django 1.11 上,您可以使用subqueries:
from django.db.models import Subquery, OuterRef
Main.objects.annotate(
label=Subquery(
Threshold.objects.filter(
Avalue__gte=OuterRef('Athreshold'),
Bvalue__gte=OuterRef('Bthreshold'),
).values('label')[:1]
)
)
如果这些值可以匹配多个阈值,则需要在内部查询上定义一些一致的排序。
基于后续问题的评论,我最终使用了将列表传递给案件的时候,因此代码类似于:
args = []
for any_threshold in Threshold.objects.all():
label = any_threshold.ThresholdValue
args.append( When(MainAvalue__lte= Avalue,MainBValue__lte= Bvalue,then=Value(label, output_field=CharField()) ))
,注释就像:
MainLevel = Case(*args, default=Value('Rejected'))
P.S:无法根据此处解释的原因