Quel est l' related_name
argument utile pour les champs on ManyToManyField
et ForeignKey
? Par exemple, étant donné le code suivant, quel est l'effet de related_name='maps'
?
class Map(db.Model):
members = models.ManyToManyField(User, related_name='maps',
verbose_name=_('members'))
related_name
donc si vous savez que vous ne l'utiliserez pas, je suppose que c'est une bonne chose. C'est une opinion personnelle bien sûr.+
signifie ne pas créer de relation inverseRéponses:
L'
related_name
attribut spécifie le nom de la relation inverse duUser
modèle vers votre modèle.Si vous ne spécifiez pas de
related_name
, Django en crée automatiquement un en utilisant le nom de votre modèle avec le suffixe_set
, par exempleUser.map_set.all()
.Si vous ne spécifiez, par exemple
related_name=maps
sur leUser
modèle,User.map_set
continuera à fonctionner, mais laUser.maps.
syntaxe est évidemment un peu plus propre et moins maladroits; ainsi, par exemple, si vous aviez un objet utilisateurcurrent_user
, vous pouvez utilisercurrent_user.maps.all()
pour obtenir toutes les instances de votreMap
modèle qui ont une relation aveccurrent_user
.La documentation Django contient plus de détails.
la source
related_name='maps+'
dans l'exemple ci-dessus?related_name
, fonctionne_set
toujours dansdjango1.11 >
??related_name
spécifié,_set
ne fonctionne plus.Ajouter au nom existant lié à la réponse est un must dans le cas où 2 FK dans le modèle pointent vers la même table. Par exemple en cas de nomenclature
Ainsi, lorsque vous devrez accéder à ces données, vous ne pouvez utiliser que le nom associé
Cela ne fonctionne pas autrement (au moins, je n'ai pas pu ignorer l'utilisation du nom associé dans le cas de 2 FK dans la même table.)
la source
related_name
devrait être pluriel. Parce que les relations ForeignKey renvoient plusieurs objets.L'
related_name
argument est également utile si vous avez des noms de classe liés plus complexes. Par exemple, si vous avez une relation de clé étrangère:Pour accéder à des
UserMapDataFrame
objets à partir de la relationUser
, l'appel par défaut seraitUser.usermapdataframe_set.all()
, ce qui est assez difficile à lire.L'utilisation de
related_name
vous permet de spécifier un nom plus simple ou plus lisible pour obtenir la relation inverse. Dans ce cas, si vous spécifiezuser = models.ForeignKey(User, related_name='map_data')
, l'appel serait alorsUser.map_data.all()
.la source
Le paramètre de nom associé est en fait une option. Si nous ne le définissons pas, Django crée automatiquement l'autre côté de la relation pour nous. Dans le cas du modèle Map, Django aurait créé un
map_set
attribut, permettant l'accès viam.map_set
dans votre exemple (m étant votre instance de classe). La formule utilisée par Django est le nom du modèle suivi de la chaîne_set
. Le paramètre de nom associé remplace donc simplement la valeur par défaut de Django plutôt que de fournir un nouveau comportement.la source
prefetch_related
utiliser pour les données de prélecture pour les données de relation plusieurs à plusieurs et plusieurs à un.select_related
consiste à sélectionner des données à partir d'une relation de valeur unique. Ces deux éléments sont utilisés pour extraire des données de leurs relations à partir d'un modèle. Par exemple, vous créez un modèle et un modèle qui a une relation avec d'autres modèles. Lorsqu'une demande arrive, vous interrogerez également leurs données de relation et Django dispose de très bons mécanismes pour accéder aux données de leur relation commebook.author.name
mais lorsque vous parcourez une liste de modèles pour récupérer leurs données de relation, Django crée chaque demande pour chaque donnée de relation. Pour remédier à cela , nous n'avonsprefetchd_related
etselected_related
la source