Как правильно сохранить или обновить значения списка в моей модели? - PullRequest
0 голосов
/ 06 июня 2019

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

class Tarifa_Sem (models.Model):
    limit_inferior_isr = models.DecimalField (max_digits = 10, decimal_places = 2)
    limit_superior = models.DecimalField (max_digits = 10, decimal_places = 2)
    cuota_fija_t = models.DecimalField (max_digits = 10, decimal_places = 2, blank = True)
    percentage_over_excess = models.DecimalField (max_digits = 10, decimal_places = 2)
 
class Calculator_isr (models.Model):
    rate = models.ForeignKey (Rate_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)
    percentage_excent_li = models.DecimalField (max_digits = 10, decimal_places = 2, null = True, blank = True)
    fixed_ quota = models.DecimalField (max_digits = 10, decimal_places = 2, null = True, blank = True)

Я делаю запрос, повторяя мои значения поля base_gravada.

    results = [
        Tarifa_Sem.objects.filter (limite_superior__gte = obj.base_gravada)
        .values_list ('limite_inferior_isr', 'cuota_fija_t', 'percentage_over_excess')
        . First ()
        for obj in Calculadora_isr.objects.all ()
    ]

Этот запрос возвращает этот список:

[(Decimal ('133.22'), Decimal ('2.59'), Decimal ('6.40')),
(Decimal ('8790.96'), Decimal ('1649.34'), Decimal ('30 .00 ')), 
(Decimal ( '2765.43'), Decimal ('292.88'), Decimal ('21 .36 ')), 
(Decimal (' 8790.96 '), Decimal (' 1649.34 '), Decimal ('30 .00'))]

Чтобы сохранить, используйте метод create ():

 

for t in results:
    ... Calculadora_isr.objects.create (limite_inf_calculo = t [0],
     percentage_excent_li = t [2], fixed_ quota = t [1]). Save ()

Когда я указываю поле и индекс списка для сохранения, проблема в том, что он не сохраняет их внутриИдентификаторы с начальными значениями base_gravated, если нет, то я создаю новые значения:

+------------------------------------------------------------------------------------+
|                            Model Calculadora_isr                                   |
+--------------------------------------+----------------------+----------------------+
|id |base_gravada| limite_inf_calculo  |       fixed_ quota   |  percentage_excent   |
+---+------------+---------------------+ ---------------------+ ---------------------+
|1  |  1000.00   |                     |                      |                      |
+---+------------+---------------------+ ---------------------+ ---------------------+
|2  | 10000.00   |                     |                      |                      |
+---+------------+---------------------+----------------------+ ---------------------+
|3  |  5000.00   |                     |                      |                      |
+---+------------+---------------------+ ---------------------+ ---------------------+
|4  | 10000.00   |                     |                      |                      |
+---+------------+---------------------+ ---------------------+ ---------------------+
|5  |            |        133.22       |         2.59         |          6.40        |
+---+------------+---------------------+ ---------------------+ ---------------------+
|6  |            |       8790.96       |      1649.34         |         30.00        |
+---+------------+---------------------+----------------------+ ---------------------+
|7  |            |       2765.43       |       292.88         |         21.36        |
+---+------------+---------------------+ ---------------------+ ---------------------+
|8  |            |       8790.96       |      1649.34         |         30.00        |
+---+------------+---------------------+ ---------------------+ ---------------------+

Мне нужно иметь возможность сохранять значения в моей модели Calculadora_isr, которая выглядит следующим образом:

+------------------------------------------------------------------------------------+
|                            Model Calculadora_isr                                   |
+--------------------------------------+----------------------+----------------------+
|id |base_gravada| limite_inf_calculo  |       fixed_ quota   |  percentage_excent   |
+---+------------+---------------------+ ---------------------+ ---------------------+
|1  |  1000.00   |       133.22        |           2.59       |          6.40        |
+---+------------+---------------------+ ---------------------+ ---------------------+
|2  | 10000.00   |      8790.96        |        1649.34       |         30.00        |
+---+------------+---------------------+----------------------+ ---------------------+
|3  |  5000.00   |      2765.43        |         292.88       |         21.36        |
+---+------------+---------------------+ ---------------------+ ---------------------+
|4  | 10000.00   |      8790.96        |        1649.34       |         30.00        |
+---+------------+---------------------+ ---------------------+ ---------------------+

Мне нужна помощь с этим спасибо

Ответы [ 2 ]

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

Ваш вопрос немного неясен для меня ,,, Но попробуйте что-то вроде этого.

# create list of dicts, to make association between PK's and values (Which represents QuerySet)
results = [
    {obj.pk: Tarifa_Sem.objects.filter (limite_superior__gte=obj.base_gravada).values_list ('limite_inferior_isr', 'cuota_fija_t', 'percentage_sobre_excedente').first()}
    for obj in Calculadora_isr.objects.all ()
]
# iterate over results and find row based on dict key, and update associated row based on dict value
for result in results:
    for k, v in result.items():    
        try:
            get_instance = Calculadora_isr.objects.get(pk=k)   #limite_inf_calculo =t[0],percentage_excendente_li=t[2], cuota_fija=t[1])
            # if model found
            get_instance.limite_inf_calculo = v[0]
            get_instance.percentage_excent_li = v[2]
            get_instance.fixed_quota = v[1]
            get_instance.save()
        except Calculadora_isr.DoesNotExist:
            pass 

Также ,,, first() означает, что сначала в коллекции QuerySet, а не сначала вБаза данных (на основе идентификатора строки).Лучше используйте earliest('pk') вместо first() (ИМХО).Оба являются QuerySet методами.

Надеюсь, это поможет вам.

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

во время создания списка results добавьте также pk экземпляров и позже используйте его для обновления экземпляра.

results = [
    [obj.id, Tarifa_Sem.objects.filter(limite_superior__gte = obj.base_gravada)
    .values_list('limite_inferior_isr', 'cuota_fija_t', 'percentage_sobre_excedente')] for obj in Calculadora_isr.objects.all ()
]

for t in results:
    instance = Calculadora_isr.objects.get(t[0])
    instance.limite_inf_calculo = t[1][0][0]
    instance.percentage_excendente_li = t[1][0][2]
    instance.cuota_fija = t[1][0][1]
    instance.save()
...