Django ORM: ошибка при назначении экземпляра внешнего ключа из CSV-импорта
У меня есть модуль, который отвечает за обновление страховых данных , задание модуля:
- берет данные из csv
- берет значения и проверяет их, а затем обновляет
- для пустых столбцов на листе будут сохранены старые данные в том виде, в каком они есть
- содержит 2 внешних ключа из разных таблиц с номером поля и идентификатором политики
- это работает с transaction.atomic() (он обновляет данные и останавливается при обнаружении ошибки в определенной строке)
и эта функция будет импортирована в функцию просмотра, которая будет реализована , но проблема заключается в том, что она не может обновить какой-либо внешний ключ из-за такой ошибки """
Строка 2: Ошибка при установке box_number=135246: Не удается назначить "'135246'": ""Provider Segregation.box_number" должен быть экземпляром "Box".
примечание: я тщательно проверил, какие данные были введены, но все же
Django ожидает, что для поля внешнего ключа будет указан экземпляр модели, а не просто строка или целое число, если вы попытаетесь сопоставить его напрямую.
box = Box.objects.get(box_number=clean_value)
fk_updates['box_number_id'] = box.id
policy = insurance_policy.objects.get(policy_id=int(clean_value))
fk_updates['PolicyId_id'] = policy.id
Чтобы обновить внешний ключ с помощью .update(), никогда не используйте имя поля связи (например, box_number) напрямую — используйте поле internal_id (например, box_number_id) или получайте к нему динамический доступ с помощью field.attname.
вместо того, чтобы пройти box_number напрямую (что бы быть строкой или целым числом), необходимо получить соответствующий экземпляр модели ( коробка в данном случае), а затем получить идентификатор этой модели инстанции правильно обновить отношения foreignkey поле.
if field == 'box_number':
try:
# Get Box instance first
box = Box.objects.get(box_number=clean_value)
fk_updates['box_number_id'] = box.id
except Box.DoesNotExist:
errors.append(f"Row {row_num}: Box '{clean_value}' not found")
continue
elif field == 'PolicyId':
try:
policy_id_int = int(clean_value)
policy = insurance_policy.objects.get(policy_id=policy_id_int)
fk_updates['PolicyId_id'] = policy.id
except ValueError:
errors.append(f"Row {row_num}: Invalid PolicyId format '{clean_value}'")
except insurance_policy.DoesNotExist:
errors.append(f"Row {row_num}: Policy '{clean_value}' not found")
continue
Затем, как только все поля (обычные и ForeignKey) будут обновлены, вы сможете применить изменения:
ProviderSegregation.objects.filter(id=record.id).update(**regular_updates)
ProviderSegregation.objects.filter(id=record.id).update(**fk_updates)