python - Django:update_or_create 重复值被填充
问题描述
我正在尝试使用从 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 比较陌生,但我似乎无法找出解决方案。
解决方案
- 您从未保存过数据
- 模型受托人:
trustee_name
总是保证得到实例?人们可以有相同的名字... - 贡献模型也是如此——不应该有一些年份或附加的东西吗?
- 使用变量和说出变量名
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()
推荐阅读
- javascript - 记录 Javascript/React
- ansible - 比较整数值时的ansible
- apache-kafka - Kafka broker 支持多少个分区
- c# - 使用 SDK v4 与 Luis 服务的连接问题
- javascript - 如何从javascript中的字符串中获取最后一个数字
- reactjs - 如何在服务器(SSR)上持久化 redux 用户登录
- mediawiki - 更改 MediaWiki 的默认语言字符串
- javascript - 如何使用 Fetch API 从输入元素提交文件
- android - Android Studio 模拟器在 2018 年 11 月 13 日更新模拟器后不工作
- c# - C# JSON 返回对象