根据其落入其中的阈值来注释标签以查询



我试图根据查询集的两个属性标记结果,这些属性属于另一个查询的两个阈值的每个组合。这是澄清的代码:

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:无法根据此处解释的原因

使用"子查询"。

最新更新