如何正确保存或更新模型中列表的值?

2024-04-29 10:22:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下型号:

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)

我通过迭代basegravada字段的值来进行查询。你知道吗

    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\u gravated初始值的id中,如果不是,我会创建新值:

+------------------------------------------------------------------------------------+
|                            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\u 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        |
+---+------------+---------------------+ ---------------------+ ---------------------+

我需要帮忙谢谢


Tags: truebasemodelsnullmaxcalculadoradecimalplaces
2条回答

在创建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()

你的问题对我来说有点不清楚,,,,但是试试这样的。你知道吗

# 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集合中的第一个,而不是数据库中的第一个(基于行id)。最好使用earliest('pk')而不是first()(IMHO)。两者都是QuerySet方法。你知道吗

希望对你有帮助。你知道吗

相关问题 更多 >