Django: IntegrityError: la colonne user_id n'est pas unique
J'ai voulu tester quelque chose qui utilise un des objets Utilisateur.
Mais pour une raison que j'obtiens:
IntegrityError: column user_id is not unique
J'ai été frapper ma tête contre le mur pendant un certain temps maintenant et il semble que je ne peux pas comprendre ce qui est mal. Au début, je pensais que peut-être la base de données n'est pas d'obtenir rincé entre les tests, mais j'ai suivi le tracé de l'Utilisateur.objets.tous les() et c'est une liste vide.
C'est le test:
from django.contrib.auth.models import User
from django.test import TestCase
class TestSomething(TestCase):
def test_create_user(self):
User.objects.create_user('foo', 'foo@bar', 'bar')
Mes paramètres de test:
from settings import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:',
}
}
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
Mise à jour:
Je dois lire mon strack des traces un peu mieux. C'est en fait le signal qui est à l'origine du problème.
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile(user=instance).save()
source d'informationauteur Pickels
Vous devez vous connecter pour publier un commentaire.
J'ai contourné le problème en réglant mon signal comme ceci:
Cela a résolu le symptôme mais pas vraiment la cause. Je pense que le mélange des tests normaux avec Django tests est à l'origine une erreur quelque part. Quand j'ai couru le test dans ma question, seul, il serait de travailler.
Si je n'ai pas d'autres réponses, je vais marquer ce que correct.
J'ai rencontré le même problème et il y a une solution simple. Le problème se produit si vous exécutez 'manage.py dumpdata" et vous avez déjà un profil Utilisateur dans votre base de données. L'Utilisateur sera dans le fichier json, de sorte que lorsque vous chargez les données de test appareil et essayez de créer un nouveau profil Utilisateur avec le même nom d'utilisateur dans votre test, vous recevrez un conflit depuis un UserProfile avec cet Utilisateur existe déjà. La solution est de supprimer le profil Utilisateur à partir du json luminaire.
Ainsi, à titre d'exemple:
Espère que ça aide.
Je suppose que vous avez
user_id
champ avec l'unique contrainte dans le modèle de Profil, n'est-ce pas?Il semble que vous essayez d'enregistrer Profil se rapportant au même objet Utilisateur dans un autre endroit dans votre code.
get_or_create
raccourci fonctionne très bien, car il crée un nouvel objet que si il n'y a aucun objet dans la base de données. Sinon, elle retourne un objet existant. D'autre part, le Profil de().save() essaie juste de sauver l'objet et lève une exception si il n'est pas possible.T-il un sens pour vous?