2011-06-17 45 views
12

我想測試一些使用User對象的東西。Django:IntegrityError:column user_id不是唯一的

但由於某種原因,我得到:

IntegrityError: column user_id is not unique 

我一直在敲打我的頭靠在牆上,而現在,似乎我無法弄清楚什麼是錯的。起初,我認爲也許數據庫不會在測試之間刷新,但我追蹤User.objects.all(),它是一個空列表。

這是測試:

from django.contrib.auth.models import User 
from django.test import TestCase 

class TestSomething(TestCase): 
    def test_create_user(self): 
     User.objects.create_user('foo', '[email protected]', 'bar') 

我的測試設置:

from settings import * 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': ':memory:', 
    } 
} 

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner' 

更新:

我應該讀我的痕跡STRACK好一點。它實際上是導致問題的以下信號。

@receiver(post_save, sender=User) 
def create_profile(sender, instance, created, **kwargs): 
    if created: 
     Profile(user=instance).save() 
+0

我想你可以嘗試以某種方式包裝用戶創建並擺脫該信號。如果包裝器還沒有UserProfile,它將處理連接User。 –

回答

6

我工作圍繞這一問題,通過調整我的信號是這樣的:

from django.dispatch import receiver 

@receiver(post_save, sender=User) 
def create_profile(sender, instance, created, **kwargs): 
    if created: 
     Profile.objects.get_or_create(user=instance) 

這解決了症狀,但不是真正的原因。我認爲用Django測試混合正常測試會導致某處發生錯誤。當我單獨在我的問題上進行測試時,它會起作用。

如果我沒有其他答案,我會把這個標記爲正確的。

1

我想你有user_id字段在配置文件模型中有唯一的約束,不是嗎?

看起來您正試圖在代碼的其他位置保存與相同用戶對象相關的配置文件。 get_or_create捷徑工作正常,因爲它只在數據庫中沒有這樣的對象時才創建新對象。否則它返回現有的對象。另一方面,Profile()。save()只是試圖保存對象,如果不可能則引發異常。

這對你有意義嗎?

4

我遇到了同樣的問題,並有一個簡單的修復。如果您運行'manage.py dumpdata'並且您的數據庫中已經有UserProfile,則會出現問題。 UserProfile將位於json文件中,因此當您加載測試數據夾具並嘗試在測試中使用相同的用戶名創建一個新的UserProfile時,您將遇到衝突,因爲具有該用戶的UserProfile已存在。解決方法是從json fixture中刪除UserProfile。

所以,作爲一個例子:

  • 你與用戶,用戶名爲「馬修」和用戶配置現有的數據庫捆綁用戶
  • 你運行manage.py dumpdata
  • 現在所產生的json夾具中有UserProfile,因爲它是你應用程序模型的一部分(但不是用戶)
  • 現在你試着在你的測試中創建一個用戶,如下所示:'User.objects.create_user('mathew','馬修@例子。COM「‘密碼’)」
  • 您的文章保存信號會觸發並嘗試創建關聯到用戶‘馬修’
  • 但是,用戶配置已經存在,所以你得到一個錯誤

希望一個用戶配置這有助於。

+0

這解決了我:'./manage.py dumpdata -e authtoken.token> mydump.json' –

相關問題