django-celeryを使用して非同期タスクを実行しようとしていますが、なぜこのエラーが発生するのかわかりません。'ドキュメントマッチングクエリがdjango-celeryに存在しません
次のように、私のセットアップは次のとおりです。
私は、メッセージングサービスとしてredis
インストールされていると私はそれが実行されていることを確認することができます。
python manage.py celery worker --loglevel=info -E -B
これは、モデルの
-------------- [email protected] v3.1.23 (Cipater)
---- **** -----
--- * *** * -- Linux-4.4.0-38-generic-x86_64-with-debian-stretch-sid
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: default:0x7f8aab484da0 (djcelery.loaders.DjangoLoader)
- ** ---------- .> transport: redis://localhost:6379/0
- ** ---------- .> results:
- *** --- * --- .> concurrency: 12 (prefork)
-- ******* ----
--- ***** ----- [queues]
-------------- .> celery exchange=celery(direct) key=celery
[tasks]
. myproject.tasks.add
. myproject.tasks.generate_cbf_maps
. myproject.tasks.sleeptask
一つが定義されて返されます。私はセロリの労働者として実行している
import djcelery
# Setup celery
djcelery.setup_loader()
BROKER_URL = 'redis://localhost:6379/0'
CELERY_IMPORTS = ("myproject.tasks",)
:私のsettings.py
ファイルには、ジャンゴ・セロリに関連する以下の行を持っていますとして:
class LabelModel(models.Model):
image = models.FileField(upload_to='documents/label',
db_column='path', default='Some Value')
これは次のように別のモデルによって参照されます。
今class Document(models.Model):
labelled_image = models.ForeignKey(LabelModel, db_column='label')
、セロリの課題の一つは、次のように定義されます
@celery.task
def generate_cbf_maps(document_id):
obj = Document.objects.get(pk=document_id)
と私は私の見解からこれを呼び出すとき、それはmyproject.myapp.models.DoesNotExist: Document matching query does not exist.
でbarfs。私はsqlite3データベースを見ると、私はこのキーが存在することがわかりますが、何とかそれを見つけることができません。
また、view
でこれを行うだけでも問題ありません。だから、のようなコール:
obj = Document.objects.get(pk=document_id)
は、これは私のviews.py
ファイルで結構ですが、私はセロリのタスクの中からそれを呼び出すとき、それは動作しません。
このように結果ブローカを構成するために何かする必要があるかどうかはわかりません。私は次のようなものを試しました:
CELERY_RESULT_BACKEND = 'redis'
しかし、それは助けになりません。
CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
そして、それが正常に動作します:
今後のインポートを__init__.pyファイルに含めましたか? – sebb
@sebbどの__init__.pyファイルにこれを入れる必要がありますか?私はそれをしていない。私がしなければならないことを知らなかった。私もPyhton 3.5、django 1.10 – Luca
にいるとしましょう。あなたのプロジェクト/プロジェクト/ celery.pyなどがあるとしましょう。これは #Djangoはそのためshared_taskはこれを使用します起動時にアプリが常にインポートされていることを確認します #absolute_import __future__インポートから :celery.pyと同じフォルダにinit__.py __という名前のファイルを作成し、この内部を置きますアプリ。 から.celery import app as celery_app#noqa – sebb