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',}])
但信息太多了。
任何提示都将受到赞赏。 谢谢!
答案 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 }}
用户