Django - обновление базы данных файлом Excel вызывает ошибку, когда первичный ключ уже существует - PullRequest
0 голосов
/ 08 марта 2020

Примечание в моей модели contact_email - мой основной ключ для модели контактов.

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

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

Произошла ошибка это IntegrityError в / upload / duplicate ключ значение нарушает уникальное ограничение "contacts_contact_pkey" ДЕТАЛИ: Ключ (contact_email) = (john@gmail.com) уже существует.

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

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

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

Ответы [ 2 ]

1 голос
/ 08 марта 2020

Вы используете все поля для запроса уникальности в 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]
        }
    )
0 голосов
/ 08 марта 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)
...