如何将django对象发送到芹菜任务?

时间:2018-06-03 13:37:59

标签: python django celery django-serializer

Hello Awesome People!

在我提问之前,我尝试了这些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: First Name> is not JSON serializable

仅仅因为来自芹菜的delay()获得了非序列化数据。

如何将Django对象发送到celery任务,以便我可以在模板中使用?我知道我可以发送python对象所需的信息

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

但信息太多了。

任何提示都将受到赞赏。 谢谢!

2 个答案:

答案 0 :(得分:1)

通常像celery这样的工具,使用格式来传递消息。这里使用JSON,并不是每个Python对象都可以默认转换为JSON对象。

然而,我们可以例如传递主键,然后在接收器侧再次将它们转换为对象。例如:

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

然后在接收器的一侧,我们可以用以下方法获取对象:

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

当然,我们本身需要传递主键:可以使用任何可以JSON序列化(或通过手动序列化)的对象。虽然我不会太复杂,但通常简单的事情比更复杂的事情更好(这是Python的信任之一)。

答案 1 :(得分:0)

无法在芹菜任务中发送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 }}用户