python - 在 Django 中使用 Celery Task 创建对象(在 ViewSet 类中)
问题描述
您好,我遇到了一个我自己无法解决的问题。我试图在 create 中调用函数 create_with_celery 但它不起作用
我应该如何使用适当的参数调用 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)
解决方案
请记住 celery 是处理异步数据的好工具,正如我看到您尝试ArticleViewSet
在ArticleSerializer
.
推荐阅读
- java - DialogFragment 未在 AsyncTask 中关闭
- python - 从不以换行符结尾的 Python 子进程获取提示
- c# - 我输入到 TextBox 的数据未分配给 UWP 应用程序中的 value 变量
- kotlin - Kotlin Ranges:为什么没有一个 `downTo` 变体来排除最后一项,如 `until`?
- r - R中的匹配数据替换
- android - 如何制作自己的设备客户端或发送方
- aws-lambda - Lambda 函数 – GET 不返回任何内容
- java - 如何使用 Jackson 进行简单的 YAML 解析
- python - 等于时间戳时如何找到时间索引?
- java - 对象列表设计模式的接口?