django orm是否立即创建对象

时间:2015-10-15 11:17:30

标签: django celery django-orm

我有一个django视图,它通过API POST请求将对象ID添加到队列中。然后我有一个celery任务,它使id出列并进行一些处理。有时celery任务会抛出一个错误,指示对象不存在。我在视图中添加了5秒的延迟,我不会再出现该错误了。

View:
def create(self, request):
    user = request.user
    serializer = UnpredictedSentenceSerializer(data=request.data)
    if serializer.is_valid():
        saved_raw_text = UnpredictedSentence.objects.create(
                                    raw_text=serializer.data['raw_text'],
                                    user=user)
        prediction.apply_async(
            args=[saved_raw_text.pk],
            countdown=5
        )
        print(saved_raw_text.pk)
        return Response(status=status.HTTP_200_OK)
    else:
        return Response(
                    serializer.errors, status=status.HTTP_400_BAD_REQUEST)


Task:
@task()
def prediction(id):
    print(id)
    print(type(id))
    UnpredictedSentence.objects.get(pk=id)
    try:
       un_sent = UnpredictedSentence.objects.get(pk=id)
    except UnpredictedSentence.DoesNotExist:
       un_sent = None
    if un_sent:
       print(type(un_sent.raw_text))
       text = json.loads(un_sent.raw_text)
       results = kudos.main(text['raw_text'])
       PredictedSentence.objects.create(
         cleaned_text=results['cleaned_text'],
         raw_text=results['raw_text'],
         sentiment=results['sentiment'],
         user=un_sent.user)
       print(results)

1 个答案:

答案 0 :(得分:2)

几乎肯定是交易问题。由于事务隔离,其他进程将不会看到在提交事务之前已创建的对象,这发生在请求结束时。五秒延迟为此提供了足够的时间。