Вы можете использовать itertools.groupby
, чтобы сгруппировать итерируемое в итерируемое из 2-х кортежей. Однако для эффективной обработки важно выполнить некоторую предварительную выборку (связанных) User
объектов, например:
from operator import itemgetter
from itertools import groupby
qs = Item.objects.filter(email=False).order_by('user_id').prefetch_related('user')
result = [
(k, list(vs))
for k, v in groupby(qs, key=attrgetter('user'))
]
Теперь result
представляет собой список из двух кортежей: первый элемент каждого кортежа содержит связанный объект User
, второй элемент кортежа - список соответствующих объектов Item
(с email=False
). User
s без таких Item
s будет не будет в списке.
Так что, если вы хотите отправить электронное письмо, вы можете перебрать список из двух кортежей, например:
for user, items in result:
user_context {
'subject' : 'some subject'
}
user_context['content] = items
send_email(user_context)
Если вы, однако, только вставлены в User
s, где существует Item
с email=False
, то вам нужно только запросить:
User.objects.filter(<b>item__email=False</b>)