Как передать queryset в django сельдерея - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь собрать бота в Instagram, используя django. Я хочу реализовать django сельдерей для запуска задачи в фоновом режиме. Здесь я столкнулся с некоторой проблемой.

task.py

from celery import shared_task
from projects.services.instagram_bot import InstagramBot


@shared_task
def lazy_post_link_1_task(post_url, current_user, bot_id, email, password, time_interval, comments):
    instagram_bot = InstagramBot()
    instagram_bot.comment_on_post(post_url, current_user, bot_id, email, password, time_interval, comments)

views.py

for bot in lazy_bots:
    lazy_bot_filter_comments = Comments.objects.all().exclude(botscomment__bot_id=bot.id)[
                                                   :int(no_of_comment_for_lazy_bot)]

    lazy_post_link_1_task.delay(lazy_post_link_1, request.user, bot.id, bot.email, bot.password,
                                                    lazy_bot_time_interval,
                                                    lazy_bot_filter_comments)

Я сталкиваюсь с ошибкой что-то вроде этого enter image description here

Я не знал, что я миссия

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Рекомендуется не передавать экземпляры моделей / наборы запросов в Celery. Вместо этого передайте идентификаторы и другую информацию для создания этого запроса на рабочей стороне.

Не передавайте объекты модели Django задачам Celery. Чтобы избежать случаев, когда объект модели уже изменился до того, как он был передан в задачу Celery, передайте первичный ключ объекта в Celery. Тогда вам, конечно, придется использовать первичный ключ, чтобы получить объект из базы данных, прежде чем работать с ним.

https://realpython.com/asynchronous-tasks-with-django-and-celery/

0 голосов
/ 24 января 2020

Вы не можете напрямую передать набор запросов в задачу Celery, поскольку аргументы задачи должны быть сериализуемыми. Вместо этого вы можете передать список идентификаторов объектов в задачу, а затем выполнить запрос из самой задачи. Другой возможный вариант - использовать Django сериализатор или лучше DRF сериализаторы , если вам нужны только данные и вы готовы обработать их с помощью сопоставлений.

...