Как работать с несколькими списками с помощью get_or_create в python?
В моем Django приложении есть задача celery, которая импортирует объекты из S3 Bucket. Чтобы убедиться, что я не импортирую объекты дважды, я использую get_or_create, также смотрите соответствующий код:
...
for key in keys:
files_obj, created = Files.objects.get_or_create(file_path=key,
defaults={'file_name': Path(key).name,
'libera_backend': resource_object})
if created:
files_obj_uuids.append(files_obj.pk)
resource_objects.append(resource_object.pk)
if not files_obj_uuids and not resource_objects:
print("No new objects found, everything already imported.")
else:
print(f'{len(files_obj_uuids)} new objects found. Importing now!')
# Building-up task-group
try:
group([extract_descriptors.s(resource_object, key, files_obj_uuid) for
(resource_object, key, files_obj_uuid) in zip(resource_objects, keys, files_obj_uuids)]).delay()
return "Import jobs started"
Как видите, сначала я получаю все объекты (ключи), затем проверяю, существует ли объект уже в базе данных, используя get_or_create. Если нет, я добавляю файлы_obj и ресурсы_object каждый в отдельный список. Позже я создаю групповую задачу, в которой передаю resource_object, key и files_obj_uuid.
В задаче extract_descriptors, которую я вызываю с этими параметрами, возникает фактическая ошибка:
django.db.utils.IntegrityError: (1062, "Дублирующая запись 'some_uri/some_file_123' для ключа 'App_files_descriptor_080cec4f_uniq'")
.
посмотрите также соответствующий код:
...
if json_isvalid:
try:
Files.objects.filter(pk=files_obj).update(descriptor=strip_descriptor_url_scheme(descriptor))
Для лучшего понимания, пожалуйста, не фокусируйтесь на "дескрипторе". Это уникальное вспомогательное поле, которое мне нужно для безголовых задач celery, выполняющихся в фоновом режиме и являющихся частью класса объектов Files.
Дело в том, что ошибка не может возникнуть, если правильно сформирован список append, показанный выше. Так как же так получается, что мой первый импорт проходит успешно, а как только я добавляю новые файлы (или новые значения "for key in keys") в ведро s3, второй импорт обрывается? Возможно ли, что все перепуталось, как только я сформировал групповую задачу, так как два списка (files_obj_uuids, resource_objects) не соответствуют друг другу?
Забавная вещь здесь заключается в том, что оператор .update показывает во втором запуске, что дескриптор 'some_uri/some_file_123' ключа номер 4 такой же, как и у ключа 1, который я импортировал ранее в первом запуске, что возвращает меня к мысли о том, что списки, которые я передаю в extract_descriptors, перепутаны