我正在尝试创建一些用于在Django中运行测试的灯具。现在,我只是从我的dev db中转储相应的模型,然后通过测试加载它们。这是我用来转储灯具的命令:
python manage.py dumpdata accounts.Profile auth.User -n auth.User --indent 4 -e contenttypes > path/to/fixture.json
关注this question和this 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只有一个条目。 Profile模型非常标准,还有一些带有个人信息的额外字段。它与模型中的User链接如下:
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
}
}
有什么想法吗?是因为我用来链接User和Profile的钩子吗?
我在Mac OS X(10.7.5)上使用Python 2.6的Enthought发行版运行Django 1.4。
答案 0 :(得分:3)
如果你有以下内容,OneToOneFields()通常会发生这种情况:
Profile.user = models.OneToOneField(User)当django创建用户记录时,它会自动为这些用户创建个人档案(可能通过post_save)。因此,当loaddata开始导入配置文件时,每个用户都有一个配置文件,其他配置文件会破坏约束。
我有2个模型通过OneToOneField指向User:
解决问题:
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 shell
或shell_plus
并删除所有个人资料和日历记录:
Profiles.objects.all().delete()
Profiles.objects.all().count()
Calendar.objects.all().delete()
Calendar.objects.all().count()
5)加载其余记录:
./manage.py loaddata other_models
答案 1 :(得分:1)
我遇到了同样的问题。在我的情况下,我确认User id = 1的数据库行不存在(通过User.objects.all())。
在我的情况下,我发现我正在加载两个灯具:
首选项夹具模型具有对用户的ForeignKey引用。如果我首先加载首选项,即使仍然没有User id = 1,我也会收到重复键错误。
交换订单以在首选项修复moe的问题之前加载admin_user。
所以 - 检查你是否已经创建了其他引用User id = 1的模型对象。
答案 2 :(得分:0)
问题是您正在尝试将夹具加载到已包含这些行的数据库中,因此它“引发IntegrityError
。你可以在运行loaddata
之前删除表,但实际上只能用于最初填充表格。
答案 3 :(得分:0)
您使用的是Postgres数据库吗?
我遇到类似的问题,加载灯具并将Postgres作为我的数据库。自动增量序列未设置为它们应设置的值。
答案 4 :(得分:0)
在使用 OneToOneField
时,您可能已经定义了 post_save
信号。因此,当创建用户时,随后的 post_save
信号会创建配置文件,而当 loaddata
尝试创建相应的配置文件时,它已经由 post_save
信号创建。最简单的做法是将代码中的 post_save
信号注释掉以执行 loaddata
。