TypeError при использовании Django update_or_create
Я пытаюсь использовать метод update_or_create, но получаю TypeError
Django 2.2.5 Python 3.7
TypeError: update_or_create() получил несколько значений для аргумента ключевого слова 'dcf_ide'
Возможно, я неправильно понимаю, как использовать метод update_or_create Я прочитал вот это пост
данные в модели DataCorrectionForm перед обновлением
dcf_ide pat status crated_date
0 43_inc_poi_1 01-001 1 2022-10-04 08:36:21.991740+00:00
1 43_inc_poi_3 01-003 1 2022-10-04 08:36:22.031926+00:00
2 43_inc_poi_7 02-001 1 2022-10-04 08:36:22.054673+00:00
3 43_inc_poi_9 01-050 1 2022-10-04 08:36:22.075715+00:00
4 43_inc_poi_11 01-002 1 2022-10-04 08:36:22.096237+00:00
5 46_inc_tai_2 02-002 1 2022-10-04 08:36:22.147911+00:00
6 46_inc_tai_4 01-004 1 2022-10-04 08:36:22.175169+00:00
7 46_inc_tai_7 02-001 1 2022-10-04 08:36:22.193514+00:00
8 46_inc_tai_9 01-050 1 2022-10-04 08:36:22.210608+00:00
records = DCF_AFTER_UPDATE.to_dict(orient='records')
for record in records:
DataCorrectionForm.objects.update_or_create(
dcf_ide=record['dcf_ide'],
**record
)
Update/Create
dcf_ide pat status crated_date
0 43_inc_poi_1 01-001 0 2022-10-04 08:36:21.991740+00:00 #<= update status column
1 43_inc_poi_3 01-003 2 2022-10-04 08:36:22.031926+00:00 #<= update status column
2 43_inc_poi_7 02-001 2 2022-10-04 08:36:22.054673+00:00 #<= update status column
3 43_inc_poi_9 01-050 2 2022-10-04 08:36:22.075715+00:00 #<= update status column
4 43_inc_poi_11 01-002 2 2022-10-04 08:36:22.096237+00:00 #<= update status column
5 46_inc_tai_2 02-002 2 2022-10-04 08:36:22.147911+00:00 #<= update status column
6 46_inc_tai_4 01-004 2 2022-10-04 08:36:22.175169+00:00 #<= update status column
7 46_inc_tai_7 02-001 0 2022-10-04 08:36:22.193514+00:00 #<= update status column
8 46_inc_tai_9 01-050 2 2022-10-04 08:36:22.210608+00:00 #<= update status column
1 43_inc_poi_2 02-002 1 2022-10-04 10:00:02.896153+00:00 #<= create row
0 46_inc_tai_1 01-001 1 2022-10-04 10:00:10.937815+00:00 #<= create row
Глядя на пост, которым вы поделились, я заметил разницу, вы определяете свой код следующим образом:
DataCorrectionForm.objects.update_or_create(
dcf_ide=record['dcf_ide'],
**record
)
Вы используете обозначение **kwargs
для **record
.
В посте они определяют update_or_create
как:
Model.objects.update_or_create(field1=val1,
field2=val2,
defaults={
'field3': val3,
'field4': val4
})
Вы можете увидеть разницу с defaults={'field3': val3,'field4': val4})
Полагаю, что для того, чтобы это работало, вы должны следовать этому примеру и написать свой код следующим образом:
DataCorrectionForm.objects.update_or_create(
dcf_ide=record['dcf_ide'],
defaults=record
)
Обратите внимание, я не запускал этот код сам, я просто посмотрел пример, которым вы поделились.
Когда вы это делаете: update_or_create(dcfe_ide=record['dcf_ide'], **record)
вы добавляете весь словарь record
в качестве аргумента.
если ваша переменная record
имеет вид: {'dcf_ide': '...', 'other': '...'}
, то на самом деле вы делаете:
DataCorrectionForm.objects.update_or_create(
dcf_ide='...',
dcf_ide='...',
other: '...',
)
Вы не можете дважды передать один и тот же аргумент ключевого слова в функцию.
На самом деле, с тем, что вы нам предоставили, аргумент dcf_ide=record['dcf_ide']
не имеет никакого смысла, поскольку вы затем передаете весь дикт record
в качестве kwargs.
Делать DataCorrectionForm.objects.update_or_create(**record)
достаточно.