【问题标题】:ContentType matching query does not exist on post_syncdbpost_syncdb 上不存在 ContentType 匹配查询
【发布时间】:2012-07-25 06:09:45
【问题描述】:

我正在尝试在创建表后立即使用post_syncdb 信号向数据库中添加一些数据。

signals.post_syncdb.connect(init)

然后在init函数中,我要设置权限,所以我用

ct = ContentType.objects.get(app_label='news', model='Article')
Permission(name='Approve articles', codename='can_approve_article', content_type=ct)

但如果我删除所有表格并运行syncdb,我会得到

...
File "...\base\functions\init.py", line 11, in init
  ct = ContentType.objects.get(app_label='news', model='Article')
...
django.contrib.contenttypes.models.DoesNotExist: ContentType matching query does not exist.

我做过的一些测试:

  • 如果我在 syncdb 之外尝试此代码,它会正常工作。
  • 如果我让 syncdb 创建所有没有此代码的表,然后添加此代码并运行 syncdb 而无需进行任何更改,它也可以正常工作。
  • 而且我很确定它曾经可以工作,但从那以后我在其他地方改变了很多东西,所以我不知道从哪里开始。
  • 我在不同应用中的其他模型上遇到相同的错误。
  • 信号被触发了大约 10 次,只有前几次抛出错误。

非常感谢任何提示!

【问题讨论】:

  • 现在的“解决方案”是捕获DoesNotExist异常并通过。在信号被触发的较晚时间之一中,可以确定内容类型并且一切正常。它有效,但如果有人有一个更漂亮的解决方案,我仍然很好奇。

标签: django signals syncdb contenttype


【解决方案1】:

将此添加到您的 init 函数的开头:

 from django.contrib.contenttypes.management import update_all_contenttypes
 update_all_contenttypes() # make sure all content types exist

【讨论】:

  • 这在 Django 1.10 中不再有效 - 不确定 update_all_contenttypes 何时被删除或替换命令是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
相关资源
最近更新 更多