python - 如何将 Django 对象发送到 celery 任务?

标签 python django celery django-serializer

大家好!

在我提出问题之前,我尝试了这些 SO 帖子:

它们都不起作用!

我想让用户在网站上看到新类(class)的更新。使用 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()从 celery 得到了一个非序列化的数据。

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

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

但这会是太多的信息。

任何提示将不胜感激。 谢谢!

最佳答案

Django 对象无法在 celery 任务中发送,您可以通过提供模板中所需的字段和查找将像模板中的 django 对象一样工作

NOTE: with serializer you will need to dump and load the data

或者只是将您的查询集转换为如下列表:

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 %} 将显示所有类(class),并且 {{ instance.first_name }} 用户

关于python - 如何将 Django 对象发送到 celery 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50666990/

相关文章:

python - Model.save() 和 ModelForm.save() 一起工作

python - 复制与深度复制 : semantics

即使我拥有完全权限,Python 在删除文件时也会出现 WindowsError 5

django - 如何在Django中添加简单的延迟任务?

python - Celerycam 错误 - 此代码不在事务管理之下

python - 错误代码 : InvalidBlobType when appending to a blob

python - 输入 Django 电话号码时如何允许用户为 "sloppy"?

python - Social-auth-app-django 'social' 不是注册的命名空间

python - 缺少所需的参数状态Python社交身份验证电子邮件验证

python - 在 Python 中调用并等待(一段时间)异步事件