首页 > 解决方案 > 迭代我的值的 2 个模型之间的 Django Queryset 过滤器对象?

问题描述

我正在做一个税收计算器,我必须查询一个模型并在另一个模型中评估它们。

我解释我想做什么。

我有以下型号:

class Tarifa_Sem(models.Model):
    limite_inferior_isr = models.DecimalField(max_digits=10, decimal_places=2)
    limite_superior = models.DecimalField(max_digits=10, decimal_places=2)

class Calculadora_isr(models.Model):
    tarifa = models.ForeignKey(Tarifa_Sem, on_delete=models.CASCADE, null=True, blank=True, related_name='calculators')
    base_gravada = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    limite_inf_calculo = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)

现在有问题的问题是我需要执行以下操作。

我的模型 Tarifa_Sem 有以下数据:

 +--------------------------------------+ 
 |          Model Tarifa_Sem            |
 +--------------------------------------+ 
 |id |limite_inf |  limite_superior     |
 +---+-----------+----------------------+
 | 1 |  0.01     |       133.21         |
 +---+-----------+----------------------+
 | 2 |  133.22   |       407.33         |
 +---+-----------+----------------------+
 | 3 |  133.22   |       610.96         |
 +---+-----------+----------------------+
 | 4 |  133.22   |       799.68         |
 +---+-----------+----------------------+
 | 5 |  133.22   |       814.66         |
 +---+-----------+----------------------+
 | 6 |  133.22   |      1023.75         |
 +---+-----------+----------------------+
 | 7 |  133.22   |      1086.19         |
 +---+-----------+----------------------+
 | 8 |  133.22   |      1130.64         |
 +---+-----------+----------------------+
 | 9 |  1130.65  |      1228.57         |
 +---+-----------+----------------------+
 | 10|  1130.65  |      1433.32         |
 +---+-----------+----------------------+
 | 11|  1130.65  |      1638.07         |
 +---+-----------+----------------------+
 | 12|  1130.65  |      1699.88         |
 +---+-----------+----------------------+

在我的计算器模型中,我在 base_gravda 中有以下数据:

 +--------------------------------------+ 
 |        Model Calculadora_isr         |
 +--------------------------------------+ 
 |id |base_gravada| limite_inf_calculo  |
 +---+------------+---------------------+
 |1  |  1000.00   |                     |
 +---+------------+---------------------+
 |2  |  1200.00   |                     |
 +---+------------+---------------------+
 |3  |  500.00    |                     |
 +---+------------+---------------------+
 |4  |  1600.00   |                     |
 +---+------------+---------------------+

我想评估我的模型 Tarifa_Sem, 上限中的每​​个 base_gravada 量,并且我通过执行以下评估返回我带来的第一个值 base_gravada > = limite_superior 并且我创建了第一个 () 以便我可以返回第一个值这比我的 base_gravada 更大,一旦我有了这个值,我告诉他给我带来 limite_inferior,这是我应该保留在模型中的,结果表应该如下所示:

 +--------------------------------------+ 
 |         Model Calculadora_isr        |
 +--------------------------------------+ 
 |id |   Base    |  limite_inf_calculo  |
 +---+-----------+----------------------+
 |1  |  1000.00  |        133.22        |
 +---+-----------+----------------------+
 |2  |  1200.00  |       1130.65        |
 +---+-----------+----------------------+
 |3  |  500.00   |        133.22        |
 +---+-----------+----------------------+
 |4  |  1600.00  |       1130.65        |
 +---+-----------+----------------------+

也就是说,base_gravada 的第一个值 1000.00 将其置于 Tarifa_Sem 的范围 ID 6 中,并为每个值带来 limite_inferior_isr 等。

现在,如果有人能告诉我缺少什么,这是我最接近解决问题的方法。

for base in Calculadora_isr.objects.all():
    Tarifa_Sem.objects.filter(Q(limite_superior__gte=base.base_gravada)).values_list('limite_inferior_isr', flat=True).first()

此查询在 Django shell 中执行,它返回以下值:

Decimal('133.22')
Decimal('1130.65')
Decimal('133.22')
Decimal('1130.65')

这些值是正确的,问题是当我尝试将结果传递给查询集时,只返回最后一个值:

for base in Calculadora_isr.objects.all():
        queryset = Tarifa_Sem.objects.filter(Q(limite_superior__gte=base.base_gravada)).values_list('limite_inferior_isr', flat=True).first()

Decimal('1130.65')

有人知道缺少什么或如何解决这个问题。

谢谢

标签: pythondjangodjango-modelsdjango-queryset

解决方案


尝试这个:

results = [
    Tarifa_Sem.objects.filter(
        limite_superior__gte=obj.base_gravada
    ).values_list('limite_inferior_isr', flat=True).first()
    for obj in Calculadora_isr.objects.all()
]

更新:

for obj in Calculadora_isr.objects.all():
    obj.limite_inf_calculo = Tarifa_Sem.objects.filter(
            limite_superior__gte=obj.base_gravada
        ).values_list('limite_inferior_isr', flat=True).first()
    obj.save()

推荐阅读