Comment obtenir tous les enfants (selon ForeignKey) à partir d'objets parents dans un modèle Django (par exemple, tous les commentaires d'un article de blog) ?

Published: 03 octobre 2022

Tags: Django; Python;

DMCA.com Protection Status

Exemple de comment obtenir tous les enfants (selon ForeignKey) à partir d'objets parents dans un modèle Django (par exemple, tous les commentaires d'un article de blog):

Fichier Models.py

Considérons le cas suivant : un blog dans lequel un article peut également être créé et commenté :

class Blog_Post(models.Model):
        content = models.TextField()
        date_created = models.DateTimeField(default=datetime.now)

class Blog_Post_Comment(models.Model):
        blog_post = models.ForeignKey(Blog_Post, null=True, blank=True, default = None,on_delete=models.DO_NOTHING)
        content = models.TextField()
        date_created = models.DateTimeField(default=datetime.now)

Ainsi, un même message peut avoir plusieurs commentaires.

Pour afficher tous les articles dans un modèle Django (appelé par exemple blog.html), nous pouvons créer une simple vue Django :

def blog_view(request):
        blog_post_obj_list = Blog_Post.objects.all()
        context = {'blog_post_obj_list':blog_post_obj_list}
        return render(request, "myapp/blog.html", context )

Obtenir tous les enfants depuis un template django

Pour itérer sur tous les posts et afficher son contenu dans le template django blog.html, une solution est de faire

{% for blog_post_obj in blog_post_obj_list %}

    {{ blog_post_obj.content }}

{% endfor %}

Maintenant pour avoir aussi tous les commentaires d'un même post, une solution est de faire ici (voir: Many-to-one relationships:

blog_post_obj.blog_post_comment_set.all

(just add the suffix _set.all to the child name: parent_obj.child_name_set.all )

{% for blog_post_obj in blog_post_obj_list %}

    {{ blog_post_obj.content }}

    {% for blog_post_comment_obj in blog_post_obj.blog_post_comment_set.all %}
        {{ blog_post_obj.content }}
    {% endfor %}

{% endfor %}

Obtenez le nombre de commentaires :

Note 1 : il est possible d'obtenir le nombre de commentaires :

{{ blog_post_obj.blog_post_comment_set.count }}

Trier les commentaires par

Note 2 : Les commentaires peuvent également être triés par une colonne donnée, par exemple date_created (voir dictsort)

{% for blog_post_comment_obj in blog_post_obj.blog_post_comment_set.all|dictsort:"date_created" %}

Références