it-swarm.com.de

Unterschied zwischen 'related_name' und 'related_query_name' Attributen in Django?

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!

17
Hùng Ng Vi

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.

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)

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

0
biswa1991