2012-07-26 75 views
2

我嘗試使用post_syncdb信號在創建表後立即添加一些數據到數據庫。post_syncdb上不存在ContentType匹配查詢

signals.post_syncdb.connect(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次,只有前幾次拋出錯誤。

非常感謝任何提示!

+0

的「解決方案」現在趕上DoesNotExist異常並通過。在稍後的一次信號被觸發時,內容類型可以被確定並且事情可以工作。它可以工作,但如果有人有一個更漂亮的解決方案,我仍然很好奇。 – Mark 2012-07-26 16:04:35

回答

7

添加到您的初始化函數的開頭:

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

前段時間重寫了代碼,所以我無法測試它,但這聽起來像是可行的,謝謝! – Mark 2013-07-19 23:21:43

+0

這不再適用於Django 1.10 - 不確定何時update_all_contenttypes被刪除或替換命令是什麼。 – shacker 2017-04-01 06:49:18