Django - обновление базы данных с помощью файла excel вызывает ошибку, когда первичный ключ уже существует

Обратите внимание, что в моей модели contact_email является первичным ключом для модели контактов.

У меня есть html-страница и форма, где пользователи могут загружать файл excel для загрузки своих контактов в базу данных. Если contact_email не был загружен ранее, все работает нормально, и контакты загружаются.

Однако, если contact_email уже существует, возникает ошибка, и информация о контакте не обновляется, например, если в новом файле Excel изменился fav_sport существующего контакта, он не будет обновляться.

Выдается ошибка IntegrityError at /upload/. Дублированное значение ключа нарушает уникальное ограничение «contacts_contact_pkey». ДЕТАЛЬ: Ключ (contact_email) = ([email protected]) уже существует.

Вот код, вызывающий ошибку:

for index, row in df.iterrows():
    created = Contact.objects.update_or_create(
        contact_name = row[0],
        fav_sport = row[1],
        contact_email = row[2],
    )

Как можно изменить этот код, чтобы устранить эту ошибку?


person Padoga    schedule 08.03.2020    source источник


Ответы (2)


Вы используете все поля для запроса уникальности в update_or_create как в документации

(при условии, что вы хотите обновить по contact_email)

for index, row in df.iterrows():
    created = Contact.objects.update_or_create(
        contact_email= row[2],
        defaults = {
            "contact_name": row[0],
            "fav_sport": row[1]
        }
    )
person iklinac    schedule 08.03.2020

defaults — это словарь пар (поле, значение), используемый для обновления объекта.

попробуйте это и дайте мне знать, если это работает:

for index, row in df.iterrows():
    defaults = {
        "contact_name": row[0],
        "fav_sport": row[1],
        "contact_email": row[2],
    }
    obj, created = Contact.objects.update_or_create(**defaults, defaults=defaults)
person Vishal Singh    schedule 08.03.2020
comment
Проблема связана с первичным ключом - › ваша рекомендация ничего не решает. Пожалуйста, перечитайте мой вопрос. - person Padoga; 08.03.2020