Django Compter le nombre de relations étrangères


Exemple

class Category(models.Model):
    name = models.CharField(max_length=20)


class Product(models.Model):
    name = models.CharField(max_length=64)
    category = models.ForeignKey(Category, on_delete=models.PROTECT)

Pour obtenir le nombre de produits pour chaque catégorie:

>>> categories = Category.objects.annotate(Count('product'))

Cela ajoute l' <field_name>__count à chaque instance renvoyée:

>>> categories.values_list('name', 'product__count')
[('Clothing', 42), ('Footwear', 12), ...]

Vous pouvez fournir un nom personnalisé pour votre attribut en utilisant un argument de mot-clé:

>>> categories = Category.objects.annotate(num_products=Count('product'))

Vous pouvez utiliser le champ annoté dans les jeux de requêtes:

>>> categories.order_by('num_products')
[<Category: Footwear>, <Category: Clothing>]

>>> categories.filter(num_products__gt=20)
[<Category: Clothing>]