Почему использование снимка set() для дедупликации по-прежнему позволяет дублировать записи в моей интеграции Django/OutPython

Программы на Python
Ответить
Anonymous
 Почему использование снимка set() для дедупликации по-прежнему позволяет дублировать записи в моей интеграции Django/Out

Сообщение Anonymous »

Я создаю сценарий синхронизации для извлечения электронных писем из определенной папки Outlook в базу данных Django с помощью pywin32. Чтобы оптимизировать производительность и избежать избыточных запросов к базе данных, я использую set() для хранения снимков существующих записей для поиска![](data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==). Однако я по-прежнему вижу повторяющиеся записи в своей базе данных.
Моя среда:
  • ОС: Windows 10
  • Outlook: 2016
  • Tech Stack: Python 3.13, Django 5.1.4, pywin32
  • База данных: SQLite
Логика (минимальный воспроизводимый пример):
часовой пояс
TIME_ZONE = 'UTC' # I also tried 'Asia/Ho_Chi_Minh'
USE_TZ = True

модель
class FloorRequest(models.Model):
request_type = models.CharField(max_length=10) # 'BADGE' or 'FLOOR'
email = models.EmailField()
request_time = models.DateTimeField() # This is where I compare timestamps
mail_entry_id = models.CharField(max_length=255, unique=True)

Питон
def backfill_all() -> None:
items = t1_folder.Items
item_list =
existing_records = set(
FloorRequest.objects.values_list('email', 'request_time', 'request_type')
)

count = 0
for item in item_list:
try:
sender = str(getattr(item, "SenderEmailAddress", "")).lower().strip()
received_time = item.ReceivedTime.replace(tzinfo=None) # Naive datetime
current_type = 'BADGE' if "badge" in item.Subject.lower() else 'FLOOR'
if (sender, received_time, current_type) not in existing_records:
FloorRequest.objects.create(
email=sender,
request_time=received_time,
request_type=current_type,
)
existing_records.add((sender, received_time, current_type))
count += 1
except Exception as e:
continue

raw_name = parsed.get("name")
если не raw_name:
raw_name = subject.split("s")[0] если "s" в теме else "Unknown"
FloorRequest.objects.create(
request_type=current_type,
name=raw_name.strip()[:255],
email=parsed.get("email") or sender,
badge_id=parsed.get("badge_id", ""),
badge_type=parsed.get("badge_type", ""),
floor=parsed.get("floor", ""),
project=parsed.get("project", ""),
nationality=parsed.get("nationality", ""),
id_type=parsed.get("id_type", ""),
id_number=parsed.get("id_number", ""),
job_title=parsed.get("job_title", ""),
gender=parsed.get("gender", ""),
arrival_date=parsed.get("arrival_date", ""),
mail_subject=subject,
mail_entry_id=entry_id,
photo=f"request_photos/{photo_filename}" if photo_filename else None,
request_time=mail_date_naive,
is_read=False,
is_processed=False,
)

existing_records.add((sender, mail_date_naive, current_type))
count += 1
print(f: {raw_name.strip()} ({mail_date_naive})")

except Exception as e:
if "An object cannot be found" in str(e):
continue
logging.error(f"Error mail {entry_id}: {e}")
continue

print(f"\n--- Done {count} ---")
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»