Создать объект (в классе ViewSet) с помощью Celery Task в Django - PullRequest
0 голосов
/ 28 мая 2020

Здравствуйте, я столкнулся с проблемой, которую не могу решить самостоятельно. Я попытался вызвать функцию create_with_celery внутри create, но она не сработала

Как мне вызвать create.delay с правильными аргументами? Я не знаю, как правильно вызвать функцию create, чтобы работники создавали объекты

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
    @app.task(bind=True)
    def create(self, request):
        article = Article.objects.create(link=request.data['link'])
        article.save()
        serializer = ArticleSerializer(article, many=False)

        words = WordList(article.link)
        # take every 90nth word for faster loading only dev approach
        i = 0
        for word in range(0, len(words.list)):

            # try to take word from database
            i += 1
            try:
                existing_word = Word.objects.filter(name=words[word])
                Word.objects.create(
                    name=existing_word[0].name,
                    advance_level=existing_word[0].advance_level,
                    definition=existing_word[0].definition,
                    article=Article.objects.get(id=article.id)
                )
                print('word nr {}/{} "{}" created from database'.format(i,
                                                                        len(words.list), words[word]))

            except:
                # if it's not existing fetch data from web
                Word.objects.create(
                    name=words[word],
                    advance_level=get_word_frequency(words[word]),
                    definition=get_word_definition(words[word]),
                    article=Article.objects.get(id=article.id)
                )
                print('word nr {}/{} "{}" fetched from web'.format(i,
                                                                   len(words.list), words[word]))

        response = {'message': 'Article created ', 'result': serializer.data}
        return Response(response, status=status.HTTP_200_OK)

Я пытаюсь сделать что-то подобное, но получаю сообщение об ошибке «Объект типа 'Article' не JSON сериализуем»

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

    @app.task(bind=True)
    def create_with_celery(self, article, serializer, words, req):
        i = 0
        for word in range(0, len(words.list)):
            # try to take word from database
            i += 1
            try:
                existing_word = Word.objects.filter(name=words[word])
                Word.objects.create(
                    name=existing_word[0].name,
                    advance_level=existing_word[0].advance_level,
                    definition=existing_word[0].definition,
                    article=Article.objects.get(id=article.id)
                )

                print('word nr {}/{} "{}" created from database'.format(i,
                                                                        len(words.list), words[word]))

            except:
                # if it's not existing fetch data from web
                Word.objects.create(
                    name=words[word],
                    advance_level=get_word_frequency(words[word]),
                    definition=get_word_definition(words[word]),
                    article=Article.objects.get(id=article.id)
                )
                print('word nr {}/{} "{}" fetched from web'.format(i,len(words.list), words[word]))


def create(self, request):
    article = Article.objects.create(link=request.data['link'])
    article.save()
    serializer = ArticleSerializer(article, many=False)
    words = WordList(article.link)
    req = request

    self.create_with_celery.delay(article, serializer, words, req)

    response = {'message': 'Article created ', 'result': serializer.data}
    return Response(response, status=status.HTTP_200_OK)

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Имейте в виду, что сельдерей - хороший инструмент для обработки асинхронных c данных, поскольку я вижу, что вы пытаетесь сделать на ArticleViewSet, вы можете добиться этого непосредственно с помощью метода сохранения ArticleSerializer.

1 голос
/ 28 мая 2020

Вы можете передавать только базовые c типы, поддерживаемые в JSON.

...