【问题标题】:Django: conflicting models in (third-party) applicationDjango:(第三方)应用程序中的冲突模型
【发布时间】:2017-01-24 01:33:04
【问题描述】:

我将第三方应用程序集成到我的 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 没问题,直到我调用我的 api 并到达 tasks.async。完整的堆栈跟踪:

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 的模型,我的 django 也没有安装应用程序。我们没有。

我搜索了一个类似的 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 项目中重现该问题;

我想尝试另一个排队系统:/ 有什么可能出错的提示吗?

谢谢!

ps:我也可以指向我的完整仓库

【问题讨论】:

  • 尝试搜索你的整个/usr/local/lib/python2.7/dist-packages/ 目录,或者你安装了所有python 包的任何地方,寻找包含字符串class Task( 的文件,我敢打赌那里有东西。
  • 确实有,我的venv很脏。我删除了两个我不使用的包,我暂时重命名了fabric的类,我删除了*pyc并重试,但没有任何变化。

标签: django task-queue django-q


【解决方案1】:

太糟糕了,我选择了huey。它简单而完整。

django-rq 看起来也是一个不错的解决方案,带有 django 仪表板集成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多