Дублирующееся значение ключа нарушает уникальное ограничение Django Python

Моя цель. Если id совпадает, то нужно обновить столбец времени создания в модели. Я не могу понять, как мне решить эту проблему. Вроде бы ничего сложного, но я застрял

if a:=Defect.objects.get(id_leather=id_file_name) == True:
    a.update(created=datetime.datetime.now())
else:
    Defect.objects.create(id_leather=id_file_name, path=path_file_save)

models.py

class Defect(models.Model):
    created = models.DateTimeField(auto_now_add=True)

Ошибка:

django.db.utils.IntegrityError: duplicate key value violates unique constraint "files_defect_id_leather_key"
DETAIL:  Key (id_leather)=(9998) already exists.

Уберите == True из вашего условия. a - это не булево значение, а экземпляр Defect. Он никогда не может быть равен True:

if a:=Defect.objects.get(id_leather=id_file_name):

Также вы не можете .update() отдельные экземпляры модели. Используйте

a.created = datetime.datetime.now()
a.save()

С учетом сказанного, рассмотрите возможность использования update_or_create для таких рабочих процессов. Ваш метод склонен к условиям гонки , т.е. другой процесс может создать тот же Defect экземпляр, пока вы еще обрабатываете else часть.

Вот как я решил свою проблему.

created_date = datetime.datetime.now()
            Defect.objects.update_or_create(id_leather=id_file_name, path=path_file_save, defaults={'created': created_date})
Вернуться на верх