如何将值从一个子查询传递到另一个查询集?

时间:2019-06-02 01:34:08

标签: python django django-queryset

您能支持我以下问题吗?

我有这个模型:

class Tarifa(models.Model):
    limite_i = models.DecimalField(max_digits=10, decimal_places=2)
    limite_s = models.DecimalField(max_digits=10, decimal_places=2)


class Calculator(models.Model):
    tarifa = models.ForeignKey(Tarifa, on_delete=models.CASCADE)
    base = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    limite = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)

我有第一个查询集,它带来了我的计算器模型行的信息:

qsl1 = Calculator.objects.values_list('base')

此查询集返回我的所有基本金额:

<QuerySet [(Decimal('3000.00'),), (Decimal('5000.00'),), (Decimal('1000.00'),)]>

稍后,我在以下查询集中将此查询作为子查询输入:

qsl2 = Tarifa.objects.filter(
Q(limite_s__gte=qsl1) 
& Q(limite_i_isr__lte=qsl1))
.values_list('limite_i')

第二个查询值是我的'limit_s'> ='base'和'limit_i'<='base'然后为我带来'limit_i'的值

现在的问题是,我只返回第一个值3000.00的比较,我还需要比较5000.00和1000.00以及所有添加的其他值。

但是我不知道你怎么能支持我,非常感谢。

2 个答案:

答案 0 :(得分:1)

当您只需要一个字段时,我建议使用扁平属性调用values_list。

bases = Calculator.objects.values_list('base', flat=True)

这将返回查询集的扁平版本:

<QuerySet [Decimal('3000.00'), Decimal('5000.00'), Decimal('1000.00')]>

获取基数后,应使用或如下查询创建Q对象:

import operator
from itertools import reduce

query_args = []
for base in bases:
    query_args.append(
        Q(limite_s__gte=base) & Q(limite_i__lte=base)
    )

query = reduce(operator.or_, query_args)

tarifas = Tarifa.objects.filter(query).values_list('limite_i', flat=True)

答案 1 :(得分:0)

如果您用related_name这样来更新ForeignKey字段:

class Calculator(models.Model):
    tarifa = models.ForeignKey(Tarifa, on_delete=models.CASCADE, related_name='calculators')
    base = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    limite = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)

然后您可以尝试这样:

Tarifa.objects.filter(Q(limite_s__gte=F('calculators__base'))&Q(limite_i__lte=F('calculators__base')))