De ce que je comprend, je ne peux pas utiliser Author car je n'ai pas
instancié la classe ?
En plus de la reponse de @jc sur ce point, j'ajoute que les classes definies ds le fichier models.py sont des classes qui ne seront jamais instanciées nulle part. On parle ici de programmation declarative, dans le sens où, ces classes ne sont utilisées par django que pour definir (declarer), quels sont les champs/attributs de la table/classe.
La preuve, lorsque tu veux creer un nouvel objet dans ta console:
(w) >>> un_autheur = Author(name='Pitt')
(w) >>> type(un_autheur.name)
<class 'str'>
(w) >>>
Pour avoir le nombre de livre dans chaque objet de type autheur, ayechoyouzeucode:
(w) >>> from django.db.models import Count
(w) >>> all_authors = Author.objects.all().annotate(number_of_books=Count('books__id'))
(w) >>> for i in all_authors:
... print(vars(i))
...
{'number_of_books': 3, '_state': <django.db.models.base.ModelState object at 0x7fb0e323d320>, 'id': 1, 'name': 'foo'}
{'number_of_books': 2, '_state': <django.db.models.base.ModelState object at 0x7fb0e323d630>, 'id': 2, 'name': 'bar'}
{'number_of_books': 1, '_state': <django.db.models.base.ModelState object at 0x7fb0e323d6d8>, 'id': 3, 'name': 'baz'}
(w) >>>
Pour avoir le nombre de livres en partant d'un objet de type Author:
(w) >>> a1 = Author.objects.first()
(w) >>> a1.books.count()
3
(w) >>> a1.name
'foo'
(w) >>>