Wofür ist das related_name
Argument nützlich für ManyToManyField
und ForeignKey
Felder? Was bewirkt beispielsweise der folgende Code related_name='maps'
?
class Map(db.Model):
members = models.ManyToManyField(User, related_name='maps',
verbose_name=_('members'))
related_name
Wenn Sie also wissen, dass Sie es nicht verwenden, ist es eine gute Sache. Das ist natürlich eine persönliche Meinung.+
bedeutet, keine umgekehrte Beziehung zu erstellenAntworten:
Das
related_name
Attribut gibt den Namen der umgekehrten Beziehung vomUser
Modell zurück zu Ihrem Modell an.Wenn Sie nicht über eine angeben
related_name
, erstellt Django automatisch einen den Namen Ihres Modells mit dem Suffix_set
, zum BeispielUser.map_set.all()
.Wenn Sie noch angeben, zum Beispiel
related_name=maps
auf demUser
Modell,User.map_set
wird immer noch funktionieren, aber dieUser.maps.
Syntax ist offensichtlich etwas saubere und weniger klobig; Wenn Sie beispielsweise ein Benutzerobjekt hattencurrent_user
, können Siecurrent_user.maps.all()
alle Instanzen IhresMap
Modells abrufen , zu denen eine Beziehung bestehtcurrent_user
.Die Django-Dokumentation enthält weitere Details.
quelle
related_name='maps+'
im obigen Beispiel getan habe ?related_name
, funktioniert_set
immer noch indjango1.11 >
?related_name
angegeben,_set
funktioniert nicht mehr.Das Hinzufügen zu vorhandenen antwortbezogenen Namen ist ein Muss, wenn das Modell 2 FKs enthält, die auf dieselbe Tabelle verweisen. Zum Beispiel bei Stücklisten
Wenn Sie also auf diese Daten zugreifen müssen, können Sie nur den zugehörigen Namen verwenden
Ansonsten funktioniert es nicht (zumindest konnte ich die Verwendung eines verwandten Namens bei 2 FKs nicht auf dieselbe Tabelle überspringen.)
quelle
related_name
sollte Plural sein. Weil ForeignKey-Beziehungen mehrere Objekte zurückgeben.Das
related_name
Argument ist auch nützlich, wenn Sie komplexere verwandte Klassennamen haben. Wenn Sie beispielsweise eine Fremdschlüsselbeziehung haben:Um auf
UserMapDataFrame
Objekte aus dem verwandten zuzugreifenUser
, wäre der StandardaufrufUser.usermapdataframe_set.all()
, der ziemlich schwer zu lesen ist.Mit
related_name
können Sie einen einfacheren oder besser lesbaren Namen angeben, um die umgekehrte Beziehung zu erhalten. In diesem Fall wäreuser = models.ForeignKey(User, related_name='map_data')
der Anruf dann , wenn Sie angebenUser.map_data.all()
.quelle
Der zugehörige Namensparameter ist tatsächlich eine Option. Wenn wir es nicht einstellen, erstellt Django automatisch die andere Seite der Beziehung für uns. Im Fall des Kartenmodells hätte Django ein
map_set
Attribut erstellt, das den Zugriff überm.map_set
in Ihrem Beispiel ermöglicht (m ist Ihre Klasseninstanz). Die Formel, die Django verwendet, ist der Name des Modells, gefolgt von der Zeichenfolge_set
. Der zugehörige Namensparameter überschreibt daher einfach Djangos Standard, anstatt neues Verhalten bereitzustellen.quelle
prefetch_related
Verwenden Sie diese Option, um Daten für viele zu viele und viele zu einer Beziehung vorab abzurufen.select_related
besteht darin, Daten aus einer Einzelwertbeziehung auszuwählen. Beide werden verwendet, um Daten aus ihren Beziehungen aus einem Modell abzurufen. Sie erstellen beispielsweise ein Modell und ein Modell, das eine Beziehung zu anderen Modellen hat. Wenn eine Anfrage kommt, werden Sie auch nach ihren Beziehungsdaten fragen und Django verfügt über sehr gute Mechanismen, um auf Daten aus ihrer Beziehung zuzugreifen,book.author.name
aber wenn Sie eine Liste von Modellen zum Abrufen ihrer Beziehungsdaten iterieren, erstellt Django jede Anfrage für jede einzelne Beziehungsdaten. Um dies zu überwinden, haben wirprefetchd_related
undselected_related
quelle