[PYTHON] [Django] À propos des relations un-à-plusieurs (related_name, _set.all ())

introduction

Il y a un paramètre appelé related_name dans l'argument de models.ForeignKey () utilisé lors de l'association de modèles entre eux dans Django, mais je ne savais pas quand il sera utilisé, donc je l'ai vérifié.

supposition

Cette fois, nous allons créer un modèle de catégorie et un modèle de publication comme suit.

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

Supposons que le code ci-dessus génère 3 catégories et 6 messages, et a la relation illustrée dans la figure suivante. スクリーンショット 2020-06-23 14.55.56.png

Les deux cas suivants sont divisés et chaque méthode est considérée.

Comment se référer à plusieurs → 1

Peut être obtenu par ʻobject.field name`

>>> post1 = Post.object.get(id=1)
>>> post1
<Post:fonction quadratique>
>>> post1.category
<Category:Math>

1 → Comment faire référence à plusieurs [_set.all ()]

Peut être obtenu avec ʻobject.model name (lower) _set.all () `

>>> category3 = Category.object.get(id=3)
>>> category3
<Category:société>
>>> category3.post_set.all()
<QuerySet [<Post:Ryoma Sakamoto>, <Post:Shogunat de Kamakura>]>

Qu'est-ce que related_name

Ajout de related_name comme argument

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') #ajouter à
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    content = models.TextField()

Utiliser related_name

>>> category3 = Category.object.get(id=3)
>>> category3
<Category:société>
>>> category3.posts.all() #Changement
<QuerySet [<Post:Ryoma Sakamoto>, <Post:Shogunat de Kamakura>]> #← Le résultat est le même

Recommended Posts

[Django] À propos des relations un-à-plusieurs (related_name, _set.all ())
À propos des arguments de filtre personnalisés de Django
A propos de la gestion des fichiers statiques Django