Können Sie den Unterschied zwischen related_name
- und related_query_name
-Attributen für das Field-Objekt in Django erklären? Wenn ich sie benutze, wie benutze ich sie? Vielen Dank!
related_name
ist das Attribut des zugehörigen Objekts, mit dem Sie mit dem Fremdschlüssel "rückwärts" zum Modell gehen können. Wenn zum Beispiel ModelA
ein Feld wie: model_b = ForeignKeyField(ModelB, related_name='model_as')
hat, können Sie auf die ModelA
-Instanzen zugreifen, die mit Ihrer ModelB
-Instanz zusammenhängen, indem Sie model_b_instance.model_as.all()
aufrufen. Beachten Sie, dass dies im Allgemeinen mit einem Plural für einen Fremdschlüssel geschrieben wird, da ein Fremdschlüssel eine Eins-zu-viele-Beziehung ist und die viele Seite dieser Gleichung das Modell ist, auf dem das Fremdschlüsselfeld angegeben ist.
Die weitere Erklärung in den Dokumenten ist hilfreich. https://docs.djangoproject.com/de/1.10/topics/db/queries/#backwards-related-objects
related_query_name
ist für die Verwendung in Django-Querysets vorgesehen. Sie können nach der umgekehrten Beziehung eines Feldes mit Fremdschlüsseln filtern. Um unser Beispiel fortzusetzen: Ein Feld in Model A
wie: model_b = ForeignKeyField(ModelB, related_query_name='model_a')
würde es Ihnen ermöglichen, model_a
als Suchparameter in einem Queryset zu verwenden, wie: ModelB.objects.filter(model_a=whatever)
. Es ist üblicher, eine einzige Form für den related_query_name
zu verwenden. Wie die Dokumente sagen, ist es nicht notwendig, sowohl related_name
als auch related_query_name
anzugeben. Django hat vernünftige Vorgaben.
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)
Hier ist die Fremdschlüssel-Vorwärtsbeziehung Album zu Musiker und die Rückwärtsbeziehung ist Musiker zu Album. Bedeutet, dass eine Albuminstanz nur mit einer Musikerinstanz in Beziehung stehen kann (Vorwärtsbeziehung), und eine Musikerinstanz kann sich auf eine Instanz mit mehreren Alben (rückwärts) beziehen. Vorwärtsabfrage wird wie dieser Album_instance.artist sein, beachten Sie hier die Vorwärtsabfrage von Album_instanc gefolgt von Interpret (Feldname). und rückwärts wäre
Musician_instance.album_set.all()
hier wird für die Rückwärtsabfrage modelname_set verwendet.
wenn Sie jetzt den verwandten_Namen wie
artist = models.ForeignKey(Musician, on_delete=models.CASCADE, related_name='back')
angeben
dann wird die Rückwärts-Abfragesyntax geändert. modelname_set (artist.set) wird durch back ersetzt. jetzt Rückwärtsabfrage
Musician_instance.back.all()
Wenn Sie bevorzugen, dass Django keine Rückwärtsbeziehung erstellt, setzen Sie related_name auf '+' oder beenden Sie es mit '+'.
und related_query_name zur Verwendung für den umgekehrten Filternamen aus dem Zielmodell