Я делаю налоговый калькулятор, и мне нужно выполнять запросы одной модели и оценивать их в другой.
Я объясняю, что я хочу сделать.
У меня есть следующие модели:
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 | |
+---+------------+---------------------+
Я хочу оценить каждое из значений base_gravada в моей модели Tarifa_Sem, верхний предел и вернуть первое значение, которое я получу, выполнив следующую оценку base_gravada> = limite_superior, и я делаю first (), чтобы я мог вернуть первое значение, которое больше, чем моя 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 помещает его в ID диапазона 6 Tarifa_Sem и возвращает 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, он возвращает следующие значения:
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')
Кто-то имеет представление о том, чего не хватает или как решить эту проблему.
Спасибо