Django Queryset фильтрует объекты между двумя моделями, повторяя мои значения? - PullRequest
0 голосов
/ 05 июня 2019

Я делаю налоговый калькулятор, и мне нужно выполнять запросы одной модели и оценивать их в другой.

Я объясняю, что я хочу сделать.

У меня есть следующие модели:

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')

Кто-то имеет представление о том, чего не хватает или как решить эту проблему.

Спасибо

1 Ответ

0 голосов
/ 05 июня 2019

Попробуйте это:

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()
...