2016-09-15 7 views
0

Я включил стороннее приложение в свой проект Django, и только когда я его импортирую, я получу это сообщение об ошибке.Django: конфликтующие модели в (стороннем) приложении

RuntimeError: Conflicting 'task' models in application 'django_q': <class 'django_q.models.Task'> and <class 'models.Task'>. 

Я озадачен тем, что мое приложение работает хорошо, поэтому я задаюсь вопросом, как это может быть ошибка на моей стороне. Я использую приложение только в своем простом случае. Тогда мой общий вопрос: как я могу расследовать?

Таким образом, приложение представляет собой django-q, очередь задач (github). Я установил его и назвал его самым простым в использовании, следуя хорошей документации.

CACHE = { 
    'default': { 
     'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 
     'LOCATION': 'cache_table', 
    } 
} 

Q_CLUSTER = { 
    'name': 'DjangORM_queue', 
    'workers': 4, 
    'timeout': 3600, 
    'retry': 4000, 
    # 'queue_limit': 50, 
    # 'bulk': 10, 
    'orm': 'default' 
} 

api.py:

# api.py 
# not putting all imports or __init__.py 
def myhook(task): 
    print task.result 
    import ipdb; ipdb.set_trace() 

def mymethod(request, pk, **kwargs): 
    from django_q.tasks import async, result 
    async('models.MyModel.method', pk, hook='myhook', sync=True) 

Теперь manage.py runserver нормально, пока я не позову моего апи и достигает tasks.async. Полный StackTrace:

Traceback (most recent call last): 
    File "/home/[...]/django/core/handlers/base.py", line 132, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/home/.../my-project/searchapp/models/api.py", line 965, in mymethod 
    tasks.async('models.MyModel.mymethod', pk, hook='myhook', sync=True) 
    File "/home/[...]/django_q/tasks.py", line 43, in async 
    return _sync(pack) 
    File "/home/[...]/django_q/tasks.py", line 176, in _sync 
    cluster.worker(task_queue, result_queue, Value('f', -1)) 
    File "/home/[...]/django_q/cluster.py", line 369, in worker 
    m = importlib.import_module(module) 
    File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/home/[...]/django_q/models.py", line 15, in <module> 
    class Task(models.Model): 
    File "/home/[...]/django/db/models/base.py", line 309, in __new__ 
    new_class._meta.apps.register_model(new_class._meta.app_label, new_class) 
    File "/home/[...]/django/apps/registry.py", line 221, in register_model 
    (model_name, app_label, app_models[model_name], model)) 
RuntimeError: Conflicting 'task' models in application 'django_q': <class 'django_q.models.Task'> and <class 'models.Task'>. 

Я первый проверил у меня нет модели под названием Task, и не мои Джанго установлены приложения. Мы этого не делаем.

Я искал аналогичный pb и нашел this SO answer, поэтому я попытался настроить импорт django-q без успеха (это не значит, что я сделал это правильно, хотя).

Это круговой импорт (SO hint)?

Интересно также отчет об ошибке Django (который не был), я нашел comment 13 (о двойных записях в sys.path и способах импорта). Мой sys.path имеет [ my_project, …/site_packages/django_q, …/site_packages/], поэтому я не чувствую влияния на комментарий 13;

Я не мог воспроизвести проблему в новом проекте django;

Я чувствую, что пытаюсь выполнить очередную систему очередей:/ Любые намеки на то, что может быть неправильным?

Спасибо!

пс: Я мог бы также указать на мой полный репо

+1

Попробуйте найти весь файл '/ usr/local/lib/python2.7/dist-packages /' или где бы вы не установили все ваши пакеты python, для файла, содержащего строку 'class Task (', I bet там есть что-то. – serg

+0

Действительно, мой venv был грязным. Я удалил два пакета, которые я не использую, я временно переименовал класс 'fabric', я удалил' * pyc' и повторил, но никаких изменений. – Ehvince

ответ

0

Слишком плохо, я пошел с huey. Это просто и полно.

django-rq также выглядит хорошим решением с интеграцией приборной панели django.

Смежные вопросы