ValueError: для распаковки требуется более 1 значения, ошибка электронной почты django

Я пытаюсь использовать django для отправки писем нескольким людям одновременно (хотя сейчас я пытаюсь заставить его работать только с одним). У меня есть класс с именем User, в котором есть поле email и внешний ключ к классу с именем Group. Теперь я пытаюсь отправить электронное письмо всем пользователям в определенной группе. Для этого у меня есть следующий код:

addresses = User.objects.filter(group__group='Operations').values_list('email')

Это правильное получение адресов электронной почты (если я напечатаю addresses, я получу [(u'[email protected]',)]. Затем я использую addresses для создания электронного письма:

email = EmailMessage('Test', 
         get_template('test.html').render(Context({'content': 'This is a TEST!'})),
         to = addresses) 

Когда я делал это раньше, вручную передавая адрес электронной почты в аргумент «кому», это работало отлично, однако теперь выдает ошибку в заголовке: «ValueError: для распаковки требуется более 1 значения. Строка кода который, кажется, создает ошибку email.send().

Что означает эта ошибка? Почему я получаю это? Как мне это исправить? Есть ли лучший способ получить адреса электронной почты всех пользователей с указанной группой?

Спасибо.


person Daniel Rosenthal    schedule 21.06.2013    source источник
comment
что происходит, когда вы делаете to = addresses[0] ?   -  person karthikr    schedule 22.06.2013


Ответы (2)


Вы хотите использовать flat=True в запросе values_list.

Из документов:

Это похоже на values(), за исключением того, что вместо словарей возвращаются кортежи при повторении.

Если вы передаете только одно поле, вы также можете передать плоский параметр. Если True, это будет означать, что возвращаемые результаты являются одиночными значениями, а не кортежами.

https://docs.djangoproject.com/en/dev/ref/models/querysets/#values-list

Таким образом, ваши адреса — это не список адресов, а итератор, который возвращает кортежи адресов, а не то, что ожидает EmailMessage.

person Peter DeGlopper    schedule 21.06.2013
comment
Ага. Вот именно. Собственно, сам догадался. - person Daniel Rosenthal; 22.06.2013

Нашел решение. На самом деле очень просто.

addresses = User.objects.filter(group__group='Operations').values_list('email', flat=True)
person Daniel Rosenthal    schedule 21.06.2013