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) достаточно.

Вернуться на верх