【问题标题】:Django loaddata UNIQUE constraint failedDjango loaddata UNIQUE 约束失败
【发布时间】:2017-03-04 18:56:07
【问题描述】:

我正在使用空数据库运行 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
        }
    }
]

感谢您的帮助,

【问题讨论】:

    标签: python json unique loaddata


    【解决方案1】:

    在创建数据库转储时排除 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-/ 为了拯救我的一天

    【讨论】:

      【解决方案2】:

      今天(2020 年 4 月 24 日)我遇到了与 Django 2.2

      类似的问题

      我的灯具文件就是这么简单:

      [
      {
          "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

      我所做的只是将 pkcontenttypes.contenttype 模型重命名为 id。之后,迁移按预期进行。

      ./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还有很多其他的模型,只是将pk重命名为id只针对contenttypes.contenttype解决了我的问题。

      【讨论】:

      • 谢谢,这对我有用。我之前尝试将所有 pk 更改为 id,但这会导致 django.contrib.contenttypes.models.DoesNotExist: ContentType matching query does not exist. KeyError: 'content_type'
      • 您的解决方案运行良好。但这背后的原因是什么?这个解决方案有什么缺点?
      • 嗨@khadimhusen,我通过反复试验得到了这一点。
      【解决方案3】:

      我遇到了类似的问题。受这篇文章的启发:

      https://github.com/yourlabs/django-cities-light/issues/89(参见“如何修复它”)

      在运行 loaddata 命令之前,我在“保存功能”之前注释了接收器信号装饰器,它起作用了。

      【讨论】:

      • 我无法想象在加载数据库转储时您希望那些后保存挂钩运行的情况......
      【解决方案4】:

      转到 json 文件并将每个 'pk' 更改为 'id' 如果你使用 vs 代码,你可以选择 1 并按 cmd/ctrl + f2 作为快捷方式

      【讨论】:

      • 对我不起作用,因为它会导致 content_type 错误
      【解决方案5】:

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

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

      你只需要执行dumpdata myapp.mymodel,而不是`dumpdata myapp.mymodel myapp.mymodel_groups"

      否则,您的直通模型数据在导出中两次,并导致唯一约束错误。

      这是一个很好的问题,当您指定一个显式的直通模型时,它的行为如何......我不知道也没有时间测试:)

      【讨论】:

        猜你喜欢
        • 2017-08-05
        • 2020-04-24
        • 1970-01-01
        • 1970-01-01
        • 2020-04-23
        • 1970-01-01
        • 2018-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多