json Django loaddata UNIQUE约束失败

qxsslcnc  于 2023-06-25  发布在  Go
关注(0)|答案(7)|浏览(110)

我运行的python manage.py loaddata 'path/to/mydata.json'带有一个空数据库(UserUserProfile表被创建,但没有填充),但是,我得到以下错误:

django.db.utils.IntegrityError: Problem installing fixture 'path/to/mydata.json': Could not load myapp.UserProfile(pk=1): UNIQUE constraint failed: myapp_userprofile.user_id

我检查了一下(即使在运行了这个命令之后),数据库根本没有填充。那么,它怎么可能给出一个错误,即pk不是唯一的呢?
如果相关的话,UserProfile只是用OneToOneField关系扩展了默认的User模型,如建议的here
下面是mydata.json包含的内容:

[
    {
        "model": "auth.user",
        "pk": 1,
        "fields": {
            "password": "pbkdf2_sha256..",
            "last_login": "2016-10-22T15:19:46.926Z",
            "is_superuser": true,
            "username": "thesuperuser",
            "first_name": "",
            "last_name": "",
            "email": "a@a.co",
            "is_staff": true,
            "is_active": true,
            "date_joined": "2016-10-22T14:48:27.394Z",
            "groups": [],
            "user_permissions": []
        }
    },
    {
        "model": "auth.user",
        "pk": 2,
        "fields": {
            "password": "pbkdf2_sha256..",
            "last_login": null,
            "is_superuser": false,
            "username": "user1",
            "first_name": "User",
            "last_name": "One",
            "email": "",
            "is_staff": false,
            "is_active": true,
            "date_joined": "2016-10-22T15:20:32Z",
            "groups": [],
            "user_permissions": []
        }
    },
    {
        "model": "auth.user",
        "pk": 4,
        "fields": {
            "password": "pbkdf2_sha256..",
            "last_login": null,
            "is_superuser": false,
            "username": "user3",
            "first_name": "User",
            "last_name": "Three",
            "email": "",
            "is_staff": false,
            "is_active": true,
            "date_joined": "2016-10-22T15:21:09Z",
            "groups": [],
            "user_permissions": []
        }
    },
    {
        "model": "auth.user",
        "pk": 3,
        "fields": {
            "password": "pbkdf2_sha256..",
            "last_login": null,
            "is_superuser": false,
            "username": "user2",
            "first_name": "User",
            "last_name": "Two",
            "email": "",
            "is_staff": false,
            "is_active": true,
            "date_joined": "2016-10-22T15:21:03Z",
            "groups": [],
            "user_permissions": []
        }
    },
    {
        "model": "myapp.userprofile",
        "pk": 1,
        "fields": {
            "user": 1,
            "money": 100
        }
    },
    {
        "model": "myapp.userprofile",
        "pk": 2,
        "fields": {
            "user": 2,
            "money": 100
        }
    },
    {
        "model": "myapp.userprofile",
        "pk": 3,
        "fields": {
            "user": 3,
            "money": 100
        }
    },
    {
        "model": "myapp.userprofile",
        "pk": 4,
        "fields": {
            "user": 4,
            "money": 100
        }
    }
]

谢谢你的帮助

ikfrs5lh

ikfrs5lh1#

创建数据库转储时排除ContentType和Auth Permissions对象。

python manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 2 > dump.json

之后,您应该能够运行该命令没有任何问题

python manage.py loaddata dump.json

感谢https://www.coderedcorp.com/blog/how-to-dump-your-django-database-and-load-it-into-/拯救了我的一天

gxwragnw

gxwragnw2#

今天(24日,2020年4月)我遇到了类似的问题Django 2.2
我的fixture文件就像这样简单:

[
{
    "model": "contenttypes.contenttype",
    "pk": 1,
    "fields": {
        "app_label": "admin",
        "model": "logentry"
    }
},
{
    "model": "contenttypes.contenttype",
    "pk": 2,
    "fields": {
        "app_label": "auth",
        "model": "permission"
    }
}]

当我运行./manage.py loaddata initial_data.json时,我得到了:
django.db.utils.IntegrityError: Problem installing fixture '/home/user/reponame/projectname/initial_data.json': Could not load contenttypes.ContentType(pk=2): UNIQUE constraint failed: django_content_type.app_label, django_content_type.model
为了使它工作,我所做的只是将pk重命名为idcontenttypes.contenttype模型。在那之后,迁移工作如预期。

./manage.py loaddata initial_data.json 
Installed 2 object(s) from 1 fixture(s)

修改后,我的initial_data.json文件是:

[
{
    "model": "contenttypes.contenttype",
    "id": 1,
    "fields": {
        "app_label": "admin",
        "model": "logentry"
    }
},
{
    "model": "contenttypes.contenttype",
    "id": 2,
    "fields": {
        "app_label": "auth",
        "model": "permission"
    }
}]

值得一提的是,我原来的initial_dataj.json还有很多其他的模型,但只为contenttypes.contenttype重命名pkid解决了我的问题。

jyztefdp

jyztefdp3#

我也遇到过类似的问题。受此帖子启发:
https://github.com/yourlabs/django-cities-light/issues/89(请参阅“如何修复”)
在运行loaddata命令之前,我在“保存函数”之前注解了接收器信号装饰器,它工作了。

lvjbypge

lvjbypge4#

转到json文件,并将每个单一的“pk”更改为“id”,如果你使用vs代码,你可以只选择1,然后按cmd/ctrl + f2作为快捷键

vtwuwzda

vtwuwzda5#

导出和导入具有ManyToMany关系的模型时也出现了同样的问题。这是因为我在导出时手动指定了ManyToMany直通模型,导致了唯一的约束错误。

class MyModel(model.Model):
    
    groups = models.ManyToManyField(
        'myapp.mymodel',        
        
    )

您只需要执行dumpdata myapp.mymodel,不需要执行`dumpdata myapp. mymmodel myapp. mymmodel_groups”
否则,通过模型数据将在导出中出现两次,并导致唯一约束错误。
这是一个很好的问题,当你指定一个显式的through模型时,它的行为如何...我不知道,也没有时间测试:)

8zzbczxx

8zzbczxx6#

加载夹具时注解您的信号。

clj7thdc

clj7thdc7#

2023年,我偶然发现了这一点,并发现了为什么会发生这种情况。我在这里背上了多个答案,这不是一个评论,因为我需要解释什么。
默认情况下,Django有一个信号在每个新的模型添加时运行。当您向应用程序添加一个新模型并运行迁移时,Django会在ContentType模型上创建一个条目,该条目是在添加一个新的模型示例时。这意味着,当你运行dumpdata,然后运行loaddata时,一旦每个模型的第一条记录被添加到数据库中,Django立即创建一个带有FK的ContentType
在你的json中加载ContentType之前,一切都很好。此时,DB中当前存在的ContentTypes(Django通过信号创建)与JSON文件中的记录发生冲突。
正如其他人所指出的,解决方案是从dumpdata命令中排除ContentType。我会建议你也排除一切从admin应用程序,这基本上是日志条目。
接下来,在运行loaddata之前,您必须注解掉您可能有的任何信号。如果你不这样做,对于每个存在的信号,当loaddata加载一个有信号的模型时,这个信号将运行并在DB中创建记录,这将不可避免地导致json文件中尚未创建的数据的失败约束。
这样一来,你的最终命令应该是:

python manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e admin -e auth.Permission --indent
 2 > dump.json

在你的Django应用程序中,你注解掉所有涉及信号的代码。然后运行:

python manage.py loaddata dump.json

完成后(希望它能成功安装),您可以取消注解您的信号代码,并感到高兴!
希望这能管用。

相关问题