Установка is_read в Exchange без чтения всего объекта - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь быстро прочитать некоторую информацию из множества электронных писем, не вытягивая весь объект, и задаю почтовый элемент как прочитанный. Особенно, так как большинство писем имеют большие вложения, я не хочу их тянуть. Для этого я пытаюсь что-то следующее:

mail_filter = acct.inbox.filter(message_id__in=email_id_list).values_list("subject", "body", "datetime_received", "sender")

mail_filter.page_size = 2
for item in mail_filter.iterator():
    do_something_with_the_tuple_in_item()

# Now I want to set is_read = True. Something like below:
acct.inbox.filter(message_id__in=email_id_list).update(is_read=True)

Хотя с values_list я мог бы избежать получения всего почтового элемента (который в противном случае, по-видимому, занимал бы много памяти, особенно для писем с вложениями), я обнаружил, что в фильтре отсутствует поддержка update (). Поэтому для того, чтобы я установил для электронной почты значение is_read, я решил извлечь объект (за счет памяти) и установить is_read = True, а затем сохранить (). По сути, он не в состоянии сохранить использование памяти с помощью values_list. Любая другая идея существует? Что-то мне не хватает?

1 Ответ

1 голос
/ 28 марта 2019

Вы можете сказать exchangelib, что нужно извлекать только некоторые значения поля и обновлять только поле is_read. Кроме того, если вы хотите обрабатывать только непрочитанные письма, вы можете добавить фильтр на значение is_read:

for item in f.filter(is_read=False).only('is_read', 'subject', 'body', ...):
    item.is_read = True
    item.save(update_fields=['is_read'])

Чтобы нагрузить сервер еще меньше, вы можете пакетно обновить ваши элементы:

update_tuples = []
for item in f.filter(is_read=False).only('is_read', 'subject', 'body', ...):
    item.is_read = True
    # bulk_update() expects a list of (Item, fieldnames) tuples
    items_to_update.append((item, ['is_read']))

account.bulk_update(update_tuples)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...