您能支持我以下问题吗?
我有这个模型:
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以及所有添加的其他值。
但是我不知道你怎么能支持我,非常感谢。
答案 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')))