【问题标题】:Django: update_or_create repeated values being populatedDjango:update_or_create 重复值被填充
【发布时间】:2019-08-06 00:30:25
【问题描述】:

我正在尝试使用从 api 获取数据的 update_or_create 更新模型的字段。问题是所有字段都只填充了 i['Concessional] 和 i['Noncessional'] 的最后两个值

我正在使用外部 api 来更新以下模型:

class Contributions(models.Model):
    trustee = models.ForeignKey(Trustee, on_delete = models.CASCADE)
    concessional_caps = models.FloatField(null = True, blank = True)
    noncessional_caps = models.FloatField(null = True, blank = True)

    concessional_contributions_to_this_fund = models.FloatField(null = True, blank = True)
    non_concessional_contributions_to_this_fund = models.FloatField(null = True, blank = True)

    concessional_contributions_to_other_fund = models.FloatField(null = True, blank = True)
    non_concessional_contributions_to_other_fund = models.FloatField(null = True, blank = True)

    concessional_contributions_as_allocated =models.FloatField(null = True, blank = True)
    non_concessional_contributions_as_allocated = models.FloatField(null = True, blank = True)

    concessional_amounts_above_caps = models.FloatField(null = True, blank = True)
    non_concessional_amounts_above_caps = models.FloatField(null = True, blank = True)

    concessional_available_total = models.FloatField(null = True, blank = True)
    non_concessional_available_total = models.FloatField(null = True, blank = True)

使用以下代码:

for i in range(len(contribution_caps_data['Data']['Members'])):
            Contributions.objects.update_or_create(trustee = Trustee.objects.get(trustee_name = contribution_caps_data['Data']['Members'][i]["Name"]))
            for j in contribution_caps_data['Data']['Members'][i]['YearBreakdown']['ContributionDetails']:
                Contributions.objects.update_or_create(trustee = Trustee.objects.get(trustee_name =  contribution_caps_data['Data']['Members'][i]["Name"]),
                    defaults = {
                    'concessional_caps': j['Concessional'],
                    'noncessional_caps': j['NonConcessional'],

                    'concessional_contributions_to_this_fund': j['Concessional'],
                    'non_concessional_contributions_to_this_fund': j['NonConcessional'],

                    'concessional_contributions_to_other_fund': j['Concessional'],
                    'non_concessional_contributions_as_allocated': j['NonConcessional'],

                    'concessional_contributions_as_allocated': j['Concessional'],
                    'non_concessional_amounts_above_caps': j['NonConcessional'],

                    'concessional_amounts_above_caps': j['Concessional'],
                    'non_concessional_amounts_above_caps': j['NonConcessional'],

                    'concessional_available_total': j['Concessional'],
                    'non_concessional_available_total': j['NonConcessional']
                    }

                    )

我正在尝试创建一个新的贡献记录,第一个循环是获取名称(外键),第二个循环是实际获取贡献的值

您建议如何解决这个问题。我是否应该先将其预处理为可用的形式(可能是字典),然后再更新模型。请原谅我这是一个微不足道的问题,但我对 Python 和 Django 比较陌生,但我似乎无法找出解决方案。

【问题讨论】:

    标签: python django


    【解决方案1】:
    • 您从未保存过数据
    • 模型受托人:trustee_name 是否总是保证获得实例?人们可以有相同的名字...
    • 对于 Contributions 模型也是如此 - 不应该有一些年份或附加的东西吗?
    • 使用变量和说出变量名
    • 如果您遍历列表,则不需要 range(len(...

    在我的脑海中,这会更好

    for member in contribution_caps_data['Data']['Members']:
        trustee, created = Trustee.objects.get_or_create(trustee_name=member['Name'])
        if created:
            trustee.save()
    
        for contribution_detail in member['YearBreakdown']['ContributionDetails']:
            # WARNING: you need to change this, otherwise you'll always get the same contribution for the trustee...
            # Perhaps there's the year in the YearBreakdown...
            contribution, created = Contributions.objects.get_or_create(trustee=trustee)  # gets same contribution in each iteration...
    
            contribution.concessional_caps = contribution_detail['Concessional']
            contribution.noncessional_caps = contribution_detail['NonConcessional']
            # ... the same for all other attributes ...
    
            contribution.save()
    

    【讨论】:

      猜你喜欢
      • 2017-07-10
      • 2019-03-22
      • 2013-05-05
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      相关资源
      最近更新 更多