Résolue

Dépendances circulaires Django

# Chaînes de caractères # Optimisation # Django

Gabriel Trouvé

Mentor

Bonsoir,

j'ai vu qu'avec Django on pouvait utiliser des chaines de caractères pour renseigner les modéles dans les clés étrangères.

C'est en rapport avec les dépendances circulaires, en gros je pense avoir compris le principe.
Est-ce que c'est souvent utilisé ? Car dans la doc de Wagtail c'est assez souvent utilisé.

Mais avec Django je ne l'ai jamais utilisé jusqu'à présent. Est-ce que ça peut-être utilisé pour optimiser les applications ?

merci d'avance

class Car(models.Model):
    manufacturer = models.ForeignKey(
        "production.Manufacturer",
        on_delete=models.CASCADE,
    )

Salut Gab, c'est tout à fait ça effectivement. Si tu mets directement la classe et non une chaîne de caractères, ça signifie que tu dois l'importer, et ça augmente les risques d'avoir des dépendances circulaires si tu utilises des modèles qui se référencent les uns les autres dans différents fichiers models.py.

En passant par une chaîne de caractères, tu enlèves ce problème.

Gabriel Trouvé

Mentor

merci !

tu aurais un exemple "courant" de dependance circulaire ?

car je n'ai jamais eu à utiliser une chaine de caractères jusqu'à aujourd'hui.

et j'ai un peu de mal à mettre en perspective le fait d'utiliser une str.

merci d'avance

Bien sûr, imagine que tu as deux modèles, "Auteur" et "Livre", répartis dans deux fichiers models.py différents :

# fichiers models/auteur.py
from models.livre import Livre

class Auteur(models.Model):
    nom = models.CharField(max_length=100)
    livre_prefere = models.ForeignKey(Livre, on_delete=models.SET_NULL, null=True)

# fichiers models/livre.py
from models.auteur import Auteur

class Livre(models.Model):
    titre = models.CharField(max_length=100)
    auteur = models.ForeignKey(Auteur, on_delete=models.CASCADE)

Dans cet exemple le modèle "Auteur" a une clé étrangère vers le modèle "Livre" (livre préféré) et inversement, "Livre" a une foreign key vers "Auteur". Du coup pour la classe Livre tu dois importer Auteur et pour la classe Auteur tu dois importer Livre : 🔁🤪 Dépendance circulaire 😅

Pour éviter ce problème, on peut utiliser des chaînes de caractères pour les foreign key comme ça tu n'as pas besoin de faire l'import :

# fichiers models/auteur.py

class Auteur(models.Model):
    nom = models.CharField(max_length=100)
    livre_prefere = models.ForeignKey("Livre", on_delete=models.SET_NULL, null=True)

# fichiers models/livre.py

class Livre(models.Model):
    titre = models.CharField(max_length=100)
    auteur = models.ForeignKey("Auteur", on_delete=models.CASCADE)

Cette fois on référence les modèles sous forme de chaînes de caractères ("Auteur" et "Livre") et il n'y a plus besoin d'importer les modules et donc plus de risque d'import circulaire :)

Gabriel Trouvé

Mentor

Oui d'accord.
Encore... merci ! ^^

Je n'ai jamais eu le problème pour le moment.

Donc en soi à part éviter un problème de dépendance ça ne change rien d'autre ? C'est vraiment pour ça qu'on utilise une chaine de caractères alors.

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.