2010-09-28 61 views
6

我用下面的命令以生成2个夹具:问题加载的Django夹具:IntegrityError:(1062, “为键 'USER_ID' 重复条目 '4'”)

./manage.py dumpdata --format=json --indent=4 --natural auth.User > fixtures/user.json 
./manage.py dumpdata --format=json --indent=4 --natural --exclude=contenttypes --exclude=auth > fixtures/full.json 

我已经得到下面的夹具命名user.json:

[ 
    { 
     "pk": 4, 
     "model": "auth.user", 
     "fields": { 
      "username": "foo", 
      "first_name": "Se\u00e1n", 
      "last_name": "Hayes", 
      "is_active": true, 
      "is_superuser": true, 
      "is_staff": true, 
      "last_login": "2010-09-27 21:57:45", 
      "groups": [], 
      "user_permissions": [], 
      "password": "!", 
      "email": "[email protected]", 
      "date_joined": "2010-09-27 21:57:45" 
     } 
    } 
] 

和以下夹具命名full.json:

[ 
    { 
     "pk": "72a75887b4a0ce06a61f9183fe1c0e15", 
     "model": "sessions.session", 
     "fields": { 
      "expire_date": "2010-10-11 21:57:45", 
      "session_data": "gAJ9cQEoVRJfYXV0aF91c2VyX2JhY2tlbmRxAlUOZmIuYXV0aC5GYkF1dGhxA1UNX2F1dGhfdXNl\ncl9pZHEEigEEdS5hOGZlODU0MmRjYmUwNmEzODIwNjhiYzYyODc2MWQxZA==\n" 
     } 
    }, 
    { 
     "pk": 1, 
     "model": "sites.site", 
     "fields": { 
      "domain": "example.com", 
      "name": "example.com" 
     } 
    }, 
    { 
     "pk": 2, 
     "model": "common.userprofile", 
     "fields": { 
      "money": 10, 
      "energy": 10, 
      "experience": 0, 
      "stamina": 10, 
      "health": 10, 
      "user": 4 
     } 
    }, 
    { 
     "pk": 2, 
     "model": "missions.missionprofile", 
     "fields": { 
      "user": 4, 
      "last_area_viewed": null 
     } 
    }, 
    { 
     "pk": 1, 
     "model": "fb.facebookuser", 
     "fields": { 
      "updated": "2010-09-27 21:57:45", 
      "uid": "24411841", 
      "created": "2010-09-27 21:57:45", 
      "access_token": "foo", 
      "url": "http://www.facebook.com/profile.php?id=24411841", 
      "user": 4, 
      "img_url": null, 
      "name": "Se\u00e1n Hayes" 
     } 
    } 
] 

运行下面的命令(在任何顺序):

./manage.py loaddata user 
./manage.py loaddata full 

引发以下异常:

Problem installing fixture '/projectpath/fixtures/full.json': Traceback (most recent call last): 
    File "/usr/lib/pymodules/python2.6/django/core/management/commands/loaddata.py", line 169, in handle 
    obj.save(using=using) 
    File "/usr/lib/pymodules/python2.6/django/core/serializers/base.py", line 165, in save 
    models.Model.save_base(self.object, using=using, raw=True) 
    File "/usr/lib/pymodules/python2.6/django/db/models/base.py", line 528, in save_base 
    result = manager._insert(values, return_id=update_pk, using=using) 
    File "/usr/lib/pymodules/python2.6/django/db/models/manager.py", line 195, in _insert 
    return insert_query(self.model, values, **kwargs) 
    File "/usr/lib/pymodules/python2.6/django/db/models/query.py", line 1479, in insert_query 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "/usr/lib/pymodules/python2.6/django/db/models/sql/compiler.py", line 783, in execute_sql 
    cursor = super(SQLInsertCompiler, self).execute_sql(None) 
    File "/usr/lib/pymodules/python2.6/django/db/models/sql/compiler.py", line 727, in execute_sql 
    cursor.execute(sql, params) 
    File "/usr/lib/pymodules/python2.6/django/db/backends/util.py", line 15, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/lib/pymodules/python2.6/django/db/backends/mysql/base.py", line 86, in execute 
    return self.cursor.execute(query, args) 
    File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 166, in execute 
    self.errorhandler(self, exc, value) 
    File "/usr/lib/pymodules/python2.6/MySQLdb/connections.py", line 35, in defaulterrorhandler 
    raise errorclass, errorvalue 
IntegrityError: (1062, "Duplicate entry '4' for key 'user_id'") 

上这是怎么回事任何想法?我知道MySQL中的前向引用存在问题,但如果在包含外键的嵌入式设备之前安装了ID为4的用户对象,那应该不会有问题,对吗?

+0

我也试图分裂full.json成更小的灯具和安装他们一次一个。只要用户的外键存在,就会生成错误。 – 2010-09-28 02:21:00

+0

你可以在这里发布你的模型的代码? – 2010-09-28 06:36:29

+1

您的模型上是否设置了“独特”设置? – 2010-09-28 09:47:51

回答

15

按阿肖克的评论,当我有同样的问题,它是通过改变我的信号处理程序来检查它是否处于“原始”模式,这显然意味着一个夹具是运行解决加载:

def create_user_profile(sender, instance, created, **kwargs): 
    if created and not kwargs.get('raw', False): 
     UserProfile.objects.create(user=instance) 

How do I prevent fixtures from conflicting with django post_save signal code?

0

Django的静态装置是一个ANTI-PATTERN,这就是你有这种问题的原因。我建议你使用一些为你生成这个灯具的库,包括ID自然。

我建议你Dynamic Dynamic Fixture

相关问题