2010-09-28 28 views
6

I utilisé les commandes suivantes pour générer 2 luminaires:problème chargement fixation Django: IntegrityError: (1062, "entrée en double '4' pour la touche 'user_id'")

./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 

j'ai le luminaire suivant user.json nommé:

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

et l'appareil suivant nommé 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" 
     } 
    } 
] 

exécutant les commandes suivantes (en soit l'ordre):

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

soulève l'exception suivante:

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'") 

Toutes les idées sur ce qui se passe? Je suis conscient qu'il y a un problème avec les références forward dans MySQL, mais cela ne devrait pas poser de problème si l'objet User avec l'identifiant 4 est en train d'être installé avant les projecteurs qui contiennent une clé étrangère, n'est-ce pas?

+0

J'ai aussi essayé fractionnement full.json en petits appareils et les ai installés un à la fois. Dès qu'une clé étrangère à l'utilisateur est présente, l'erreur est générée. –

+0

Pouvez-vous poster le code pour vos modèles ici? –

+1

Avez-vous des paramètres '' unique'' sur vos modèles? –

Répondre

15

Selon le commentaire de Ashok, quand j'eu le même problème, il a été résolu en changeant mon gestionnaire de signal pour vérifier si elle est en cours d'exécution en mode « brut » qui signifie apparemment un appareil est étant chargé:

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

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

0

Fixation statique de Django est un ANTI-MOTIF, c'est la raison pour laquelle vous avez ce genre de problème. Je vous suggère d'utiliser une bibliothèque qui génère ces appareils pour vous, y compris l'ID naturellement.

Je vous suggère Dynamic Dynamic Fixture