Pouvez-vous expliquer la différence entre les attributs related_name
et related_query_name
de l'objet Field dans Django? Quand je les utilise, comment les utiliser? Merci!
related_name
sera l'attribut de l'objet associé qui vous permettra de revenir en arrière dans le modèle contenant la clé étrangère. Par exemple, si ModelA
a un champ tel que: model_b = ForeignKeyField(ModelB, related_name='model_as')
, cela vous permettrait d'accéder aux instances ModelA
qui sont liées à votre instance ModelB
en allant à model_b_instance.model_as.all()
. Notez que ceci est généralement écrit avec un pluriel pour une clé étrangère, car une clé étrangère est une relation un à plusieurs et que le côté multiple de cette équation est le modèle avec le champ Clé étrangère déclaré.
Les explications complémentaires liées à la documentation sont utiles. https://docs.djangoproject.com/fr/1.10/topics/db/queries/#backwards-related-objects
related_query_name
est à utiliser dans les jeux de requêtes Django. Il vous permet de filtrer la relation inverse d'un champ associé à une clé étrangère. Pour continuer notre exemple - avoir un champ sur Model A
tel que: model_b = ForeignKeyField(ModelB, related_query_name='model_a')
vous permettrait d’utiliser model_a
comme paramètre de recherche dans un jeu de requête, tel que: ModelB.objects.filter(model_a=whatever)
. Il est plus courant d'utiliser une forme singulière pour le related_query_name
. Comme le dit la documentation, il n'est pas nécessaire de spécifier les deux (ou l'un des) related_name
et related_query_name
. Django a des valeurs par défaut sensibles.
class Musician(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
class Album(models.Model):
artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
Ici, la relation avant-clé étrangère est album au musicien et la relation arrière musicien à l'album. signifie qu'une instance d'album ne peut avoir de relation qu'avec une seule instance de musicien (relation directe) et qu'une instance de musicien peut être associée à plusieurs instances d'album (en arrière). La requête forward sera comme ceci: Album_instance.artist, notez ici la requête forward effectuée par Album_instanc suivie de l'artiste (nom du champ). et en arrière serait
Musician_instance.album_set.all()
ici, la requête en arrière modelname_set est utilisée.
maintenant si vous spécifiez le related_name comme
artist = models.ForeignKey(Musician, on_delete=models.CASCADE, related_name='back')
alors la syntaxe de la requête en arrière sera changée modelname_set (artist.set) sera remplacée par la valeur précédente. maintenant requête en arrière
Musician_instance.back.all()
Si vous préférez que Django ne crée pas de relation en arrière, définissez related_name sur '+' ou terminez-la par '+'.
et related_query_name à utiliser pour le nom du filtre inverse à partir du modèle cible