Dépendances circulaires Django
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.
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 :)
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte