Класс модели robovise.models.RoboProcessedFiles не объявляет явную метку app_label и не находится в приложении в INSTALLED_APPS Celery
Я использую celery в своем проекте django.
2 проблемы, задача autodiscover не обнаруживает мою задачу в robovise/tasks.py, поэтому мне пришлось явно передать путь к файлу tasks в аргументе include
экземпляра Celery
.
Затем, когда я пытаюсь вызвать задачу в моей оболочке django, я получаю эту ошибку в Celery:
[2021-08-17 16:26:36,312: ERROR/MainProcess] Task robovise.tasks.process_new_users_resp[5763be00-77d4-4705-bb9a-6e06f2b03464] raised unexpected: RuntimeError("Model class robovise.models.RoboProcessedFiles doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.")
Traceback (most recent call last):
File "/Users/cyzanfar/Desktop/beagle/projects/financial_services/env/lib/python3.8/site-packages/celery/app/trace.py", line 450, in trace_task
R = retval = fun(*args, **kwargs)
File "/Users/cyzanfar/Desktop/beagle/projects/financial_services/env/lib/python3.8/site-packages/celery/app/trace.py", line 731, in __protected_call__
return self.run(*args, **kwargs)
File "/Users/cyzanfar/Desktop/beagle/projects/financial_services/financial_services/robovise/tasks.py", line 5, in process_new_users_resp
from robovise.models import RegisteredUser
File "/Users/cyzanfar/Desktop/beagle/projects/financial_services/financial_services/robovise/models.py", line 12, in <module>
class RoboProcessedFiles(models.Model):
File "/Users/cyzanfar/Desktop/beagle/projects/financial_services/env/lib/python3.8/site-packages/django/db/models/base.py", line 113, in __new__
raise RuntimeError(
RuntimeError: Model class robovise.models.RoboProcessedFiles doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
Я видел много сообщений, говорящих об этой проблеме, но не нашел никакого решения. Это действительно странно, поскольку у меня есть такая же установка в другом проекте, и она работает нормально.
структура проекта:
├── financial_services
│ ├── __init__.py
│ ├── asgi.py
│ ├── celery.py
│ ├── settings
│ │ ├── __init__.py
│ │ ├── base.py
│ │ ├── development.py
│ │ └── production.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── requirements.txt
└── robovise
├── __init__.py
├── admin.py
├── apps.py
├── constants.py
├── helpers.py
├── migrations
├── models.py
├── seed.py
├── services.py
├── tasks.py
├── tests.py
└── views.py
celery.py
from __future__ import absolute_import
from celery import Celery
# Set the default Django settings module for the 'celery' program.
# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'financial_services.settings')
app = Celery('financial_services', include=['robovise.tasks'])
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
и вот robovise/tasks.py:
from celery import shared_task
@shared_task
def process_new_users_resp():
from robovise.models import RegisteredUser
print("IN TASK!!!")
RegisteredUser.fetch_and_update_resp()
return True
Также мой settings.base.py:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'robovise',
]