Django ORM: ошибка при назначении экземпляра внешнего ключа из CSV-импорта

У меня есть модуль, который отвечает за обновление страховых данных , задание модуля:

  1. берет данные из csv
  2. берет значения и проверяет их, а затем обновляет
  3. для пустых столбцов на листе будут сохранены старые данные в том виде, в каком они есть
  4. содержит 2 внешних ключа из разных таблиц с номером поля и идентификатором политики
  5. это работает с 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)
Вернуться на верх