2013-04-02 20 views
2

我試圖創建一些裝置來在Django中運行測試。現在,我只是從我的開發數據庫轉儲適當的模型,然後通過測試加載這些模型。下面是我用轉儲燈具的命令:當在Django裝置中加載auth.user和配置文件模型時出現IntegrityError

python manage.py dumpdata accounts.Profile auth.User -n auth.User --indent 4 -e contenttypes > path/to/fixture.json 

this questionthis one使用自然鍵和排除的內容類型我已經添加標誌。這並沒有幫助 - 我收到此錯誤信息:

IntegrityError: Could not load accounts.Profile(pk=1): duplicate key value violates unique constraint "accounts_profile_user_id_key" 
DETAIL: Key (user_id)=(1) already exists 

我已經手動檢查夾具和只有一個針對該用戶ID條目。個人資料模型非常標準,還有一些額外的個人信息字段。它連接到用戶的模型如下:

def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Profile.objects.create(user=instance) 

post_save.connect(create_user_profile, sender=User) 

在完整的名字,這裏的燈具的樣子:

{ 
    "pk": 1, 
    "model": "auth.user", 
    "fields": { 
     "username": "unique_username", 
     "first_name": "", 
     "last_name": "", 
     "is_active": true, 
     "is_superuser": true, 
     "is_staff": true, 
     "last_login": "2013-03-31T23:19:44.391", 
     "groups": [], 
     "user_permissions": [], 
     "password": "secret", 
     "email": "email", 
     "date_joined": "2013-03-13T21:30:39.225" 
    } 
}, 
{ 
    "pk": 1, 
    "model": "accounts.profile", 
    "fields": { 
     "status": "active", 
     "first_name": "John", 
     "last_name": "Smith", 
     "middle_name": null, 
     "headline": "Something very cool", 
     "user": [ 
      "unique_username" 
     ], 
     "location": null 
    } 
} 

任何想法?是因爲我使用鏈接用戶和個人資料的鉤子嗎?

我跑的Django 1.4使用Python 2.6的Enthought發行版,在Mac OS X(10.7.5)。

回答

0

的問題是,你正在試圖燈具加載到已經包含這些行的數據庫,所以它拋出一個IntegrityError。您可以在運行loaddata之前刪除表,但實際上只能使用燈具來初始填充表。

+0

是否Django的測試數據庫已經包含了所有的數據?我想,可能是錯誤的,測試數據庫中的唯一數據是我包含在夾具中的數據。 – tchaymore

1

我遇到了同樣的問題。在我的情況下,我確認用戶id = 1的數據庫行不存在(通過User.objects.all())。

在我的情況下,原來,我是裝兩個固定器:

  • initial_preferences.json(自定義用戶偏好)
  • initial_admin_user.json

偏好固定模式有一個ForeignKey引用用戶。如果我首先加載首選項,即使仍然沒有User id = 1,我也會得到重複的密鑰錯誤。

交換順序加載admin_user偏好固定問題的萌前。

所以 - 檢查,看看是否你已經創建了具有用戶ID = 1的參考其它模型對象。

0

這可能不是一個offtopic,但由於谷歌點位置o與裝載固定裝置與例如類似的問題。 contenttypes.ContentType即時幫助。

使用natural keys可以避免在數據更改主鍵時重複鍵值衝突。

dumpdata中添加--natural-foreign選項,例如:

$ python manage.py dumpdata --natural-foreign contenttypes auth.Permission auth.Group 
1

這往往與OneToOneFields(),如果您有發生:

Profile.user = models.OneToOneField(用戶)當Django創建用戶記錄它會自動爲這些用戶創建配置文件(可能通過post_save)。因此,當loaddata開始導入配置文件時,每個用戶都有一個配置文件,並且其他配置文件會打破該限制。

我有2個型號通過OneToOneField指向用戶:

  • 型材;
  • 日曆。

要解決該問題的方法:

1)出口auth.user到一個單獨的auth_user.json;

./manage.py dumpdata --indent=4 auth.user > auth_user.json 

2)出口其他型號:

./manage.py dumpdata --indent=4 -e sessions -e admin -e contenttypes -e auth.Permission --natural-foreign > other_models.json 

3)負荷用戶記錄: ./manage.py loaddata AUTH_USER

4)開放./manage.py shellshell_plus 並刪除所有配置文件和日曆記錄:

Profiles.objects.all().delete() 
Profiles.objects.all().count() 
Calendar.objects.all().delete() 
Calendar.objects.all().count() 

5)加載的記錄的其餘部分:

./manage.py loaddata other_models 
相關問題