在Django fixture中加载auth.user和profile模型时出现IntegrityError

时间:2013-04-02 22:54:42

标签: python django fixtures

我正在尝试创建一些用于在Django中运行测试的灯具。现在,我只是从我的dev db中转储相应的模型,然后通过测试加载它们。这是我用来转储灯具的命令:

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只有一个条目。 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。

5 个答案:

答案 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 shellshell_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())。

在我的情况下,我发现我正在加载两个灯具:

  • initial_preferences.json(自定义用户首选项)
  • initial_admin_user.json

首选项夹具模型具有对用户的ForeignKey引用。如果我首先加载首选项,即使仍然没有User id = 1,我也会收到重复键错误。

交换订单以在首选项修复moe的问题之前加载admin_user。

所以 - 检查你是否已经创建了其他引用User id = 1的模型对象。

答案 2 :(得分:0)

问题是您正在尝试将夹具加载到已包含这些行的数据库中,因此它“引发IntegrityError。你可以在运行loaddata之前删除表,但实际上只能用于最初填充表格。

答案 3 :(得分:0)

您使用的是Postgres数据库吗?

我遇到类似的问题,加载灯具并将Postgres作为我的数据库。自动增量序列未设置为它们应设置的值。

这篇文章帮助我:https://www.vlent.nl/weblog/2011/05/06/integrityerror-duplicate-key-value-violates-unique-constraint/

答案 4 :(得分:0)

在使用 OneToOneField 时,您可能已经定义了 post_save 信号。因此,当创建用户时,随后的 post_save 信号会创建配置文件,而当 loaddata 尝试创建相应的配置文件时,它已经由 post_save 信号创建。最简单的做法是将代码中的 post_save 信号注释掉以执行 loaddata