Как отправить объекты django на задания сельдерея? - PullRequest
0 голосов
/ 03 июня 2018

Привет, удивительные люди!

Перед моим вопросом я попробовал следующие сообщения SO:

Ни одна из них не работает!

Я хочу, чтобы пользователи оставались на сайтеОбновление с новыми курсами.С набором запросов Courses я хочу отправить их по электронной почте.

send_daemon_email.delay(instance=instance,all_courses=Course.objects.all())

И моя функция выглядит следующим образом:

@shared_task
def send_daemon_email(instance,all_courses):
    ctx = {'instance':instance,'all_courses':all_courses}
    message = get_template("emails/ads.html").render(ctx)
    ''' '''

Когда я пытался отправить электронное письмо конкретномуuser Полученная ошибка:

<User: First Name> is not JSON serializable

Только потому, что delay() из сельдерея получил несериализованные данные.

КакЯ могу отправить объекты Django в задачу сельдерея, чтобы использовать их в шаблоне ?Я знаю, что могу отправить информацию, необходимую как объект python

send_daemon_email.delay(first_name='Name',
      last_name='Lapr',all_courses = [{'title1':'title1',},{'title2':'title2',}])

, но это будет слишком много информации.

Любая подсказка будет оценена.Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Объекты Django не могут быть отправлены в задачах сельдерея, вы можете сериализировать с помощью сериализаторов django (from django.core import serializers), предоставляя поля, необходимые в шаблоне, и поиск будет работать как объект django в шаблоне

ПРИМЕЧАНИЕ: при использовании сериализатора вам нужно будет выгружать и загружать данные

или просто преобразовать ваш набор запросов в список, подобный следующему:

send_daemon_email.delay(
    instance = User.objects.filter(pk=user.pk).values('first_name','last_name'),
    all_courses= list(Course.objects.values('title','other_field'))
)

Все, что вам нужно, это предоставить поля, которые вам действительно нужны в шаблоне, с помощью values('')

@shared_task
def send_daemon_email(instance,all_courses):
    ctx = {
        'instance': instance,
        'all_courses': all_courses,
    }
    message = get_template("emails/ads.html").render(ctx)

В шаблонах {% for course in all_courses %}{{course}}{% endfor %} отобразит все курсы, а {{ instance.first_name }} пользователь

0 голосов
/ 03 июня 2018

Ну, как правило, такие инструменты, как сельдерей, используйте формат для передачи сообщений.Здесь используется JSON, и не каждый объект Python по умолчанию можно превратить в объект JSON.

Однако мы можем, например, передать первичные ключи, а затем снова превратить их в объекты на стороне получателя.Так, например:

send_daemon_email.delay(
    instance=<b>instance.pk</b>,
    all_courses=<b>list(</b>Course.objects.all()<b>.values_list('pk', flat=True))</b>
)

и затем на стороне приемника мы можем получить объекты с помощью:

@shared_task
def send_daemon_email(instance,all_courses):
    ctx = {
        'instance': <b>User.objects.get(pk=instance)</b>,
        'all_courses': <b>Course.objects.filter(pk__in=all_courses)</b>
    }
    message = get_template("emails/ads.html").render(ctx)

Конечно, мы не per se необходимо передавать первичные ключи: можно использовать любой объект, который можно сериализовать JSON (или вручную).Хотя я бы не стал делать это слишком сложным, обычно простые вещи работают лучше, чем более сложные (что является одним из кредо Python).

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