web-dev-qa-db-fra.com

Différence entre les attributs 'related_name' et 'related_query_name' dans Django?

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!

17
Hùng Ng Vi

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.

30
ChidG
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

0
biswa1991