Résolue

Erreur lors de l'utilisateur de l'email comme nom d'utilisateur

# Bases de données # Django # Migrations

Bonjour,

Lorsque j'utilise l'adresse email comme nom d'utilisateur et que je fais les migrations j'ai une erreur.

**accounts/models.py**

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password, **kwargs):
        if not email:
            raise ValueError("L'adresse mail est obligatoire")

        email = self.normalize_email(email)
        user = self.model(email=email) # model de la classe Shopper
        user.set_password(password) #encrypter le mot de passe
        user.save()

        return user

    def create_superuser(self, email, password, **kwargs):
        kwargs["is_staff"] = True
        kwargs["is_superuser"] = True
        kwargs["is_active"] = True

        return self.create_user(email=email, password=password, **kwargs)

class Shopper(AbstractUser):
    username = None
    email = models.EmailField(max_length=255, unique=True)
    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = []
    objects = CustomUserManager()
**shop/models.py**

class Order(models.Model):
    user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE)
    shop = models.ForeignKey(Shop, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    ordered = models.BooleanField(default=False)
    ordered_date = models.DateTimeField(blank=True, null=True)

Message d'erreur:
django.db.utils.IntegrityError: The row in table 'shop_order' with primary key '3' has an invalid foreign key: shop_order.user_id contains a value '8' t
hat does not have a corresponding value in accounts_shopper.id.

Si j'ai bien compris, la classe "user" hérite de la classe Shopper, donc je n'arrive pas à comprendre pourquoi le user_id ne correspond pas au shopper_id.

Merci par avance pour votre aide.

Maryline

Thibault houdon

Mentor

Salut Maryline,

De ce que je vois de ton message d'erreur, le problème n'est pas directement lié à ton modèle d'utilisateur personnalisé (Shopper) ou à l'utilisation d'email comme nom d'utilisateur. Il semble plutôt que tu as un problème de clé étrangère dans ta table de commandes (Order).

L'erreur indique que dans ta table shop_order, la ligne avec la clé primaire '3' a un user_id qui est '8' et ce user_id n'a pas de correspondance dans la table accounts_shopper.id. Autrement dit, tu essaies d'associer une commande à un utilisateur qui n'existe pas.

Pour résoudre ce problème, il y a quelques choses que tu pourrais vérifier :

  1. Est-ce que l'entrée Shopper avec l'ID de '8' existe vraiment dans la table accounts_shopper ? Si non, d'où vient ce chiffre '8'? Tu peux vérifier cela en regardant directement dans ta base de données ou via l'interface d'administration Django si tu l'as configurée.

  2. Est-ce que tu as eu des changements majeurs dans tes modèles et ensuite tu as essayé de faire une migration sans corriger les données ? Cela pourrait entraîner des incohérences de données. Dans ce cas, tu pourrais avoir à nettoyer ta base de données et à recréer les données en fonction de tes nouveaux modèles.

  3. Enfin, assure-toi d'avoir bien défini AUTH_USER_MODEL dans tes settings. Comme tu utilises un modèle personnalisé d'utilisateur, tu dois ajouter AUTH_USER_MODEL = 'accounts.Shopper' dans tes settings pour que Django sache quel modèle utiliser.

Voilà pour les pistes à explorer :)

Salut,

Après un nettoyage de la base de donnnées, tout fonctionne.
Le problème n'était effectivement pas directement lié à ton modèle d'utilisateur personnalisé ou à l'utilisation d'email comme nom d'utilisateur.

Merci pour ton aide :)

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.