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
| Liens | Site |
|---|---|
| Django Models Parent Child Template Rendering | medium.com |
| django how to following relationships backwards? | stackoverflow |
| Access Children Through Parent in Django | stackoverflow |
| Django Accessing Child Data in Templates from Parent object | stackoverflow |
| Django: Display count of child in HTML template when querying Parent | stackoverflow |
| Sorting related items in a Django template | stackoverflow |
| dictsort | djangoproject.com |
