[PYTHON] [Django] Über eine Eins-zu-Viele-Beziehung (related_name, _set.all ())

Einführung

Das Argument von models.ForeignKey () enthält einen Parameter namens related_name, der verwendet wird, wenn Modelle in Django miteinander verknüpft werden. Ich wusste jedoch nicht, wann er verwendet wird, und habe ihn daher überprüft.

Annahme

Dieses Mal erstellen wir ein Kategoriemodell und ein Post-Modell wie folgt.

apps/models.py


class Category(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)

    def __str__(self):
        return self.name

class Post(models.Model):
    category = models.ForeignKey(to=Category, on_delete=models.CASCADE)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    content = models.TextField()

    def __str__(self):
        return self.title

Angenommen, der obige Code generiert 3 Kategorien und 6 Beiträge und hat die in der folgenden Abbildung gezeigte Beziehung. スクリーンショット 2020-06-23 14.55.56.png

Die folgenden zwei Fälle werden aufgeteilt und jede Methode wird berücksichtigt.

Wie man sich auf viele bezieht → 1

Kann über object.field name erhalten werden

>>> post1 = Post.object.get(id=1)
>>> post1
<Post:quadratische Funktion>
>>> post1.category
<Category:Mathematik>

1 → Wie man auf viele verweist [_set.all ()]

Kann mit object.model name (lower) _set.all () abgerufen werden

>>> category3 = Category.object.get(id=3)
>>> category3
<Category:Gesellschaft>
>>> category3.post_set.all()
<QuerySet [<Post:Ryoma Sakamoto>, <Post:Kamakura Shogunate>]>

Was ist verwandter_name

Related_name als Argument hinzugefügt

apps/models.py


class Category(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)

class Post(models.Model):
    category = models.ForeignKey(to=Category, on_delete=models.CASCADE, related_name='posts') #hinzufügen
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    content = models.TextField()

Verwenden Sie den verwandten Namen

>>> category3 = Category.object.get(id=3)
>>> category3
<Category:Gesellschaft>
>>> category3.posts.all() #Veränderung
<QuerySet [<Post:Ryoma Sakamoto>, <Post:Kamakura Shogunate>]> #← Das Ergebnis ist das gleiche

Recommended Posts

[Django] Über eine Eins-zu-Viele-Beziehung (related_name, _set.all ())
Informationen zu benutzerdefinierten Django-Filterargumenten
Informationen zum Umgang mit statischen Django-Dateien