Дублирующееся значение ключа нарушает уникальное ограничение 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})