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 |