Dans Django, j'ai un modèle Checkout, qui est un ticket pour quelqu'un qui vérifie l'équipement. J'ai aussi un modèle OrganizationalUnit auquel se rapporte le modèle Checkout (via ForeignKey), car la personne à la caisse appartient à un OrganizationalUnit sur notre campus. Le composant OrganizationalUnit a une relation de soi, de sorte que plusieurs unités d'organisation peuvent être les enfants d'une unité d'organisation donnée, et ces enfants peuvent avoir des enfants, et ainsi de suite. Voici les modèles, un peu simplifiés.Comment puis-je obtenir le nombre total d'objets associés d'un modèle et des objets associés aux enfants du modèle?
class OrganizationalUnit(models.Model):
name = models.CharField(max_length=100)
parent = models.ForeignKey(
'self',
blank=True, null=True,
related_name='children',
)
class Checkout(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
department = models.ForeignKey(
OrganizationalUnit,
null=True,
blank=True,
related_name='checkouts',
)
Je souhaite connaître le nombre de Checkouts associés à un certain OrganizationalUnit et à tous ses enfants. Je sais comment obtenir le compte de toutes les caisses qui sont liées à une OU. Mais comment faire pour que ce compte reflète les retraits des enfants de cette unité d'organisation et de leurs enfants? Est-ce que j'utilise une sorte de boucle itérative?
EDIT: Je suppose que je ne peux toujours pas tout à fait envelopper la tête autour de la commande while pour le faire. Les unités organisationnelles peuvent aller aussi loin que l'utilisateur veut les imbriquer, mais à l'heure actuelle, le maximum est de 5 profonds. J'ai écrit ceci ...
for kid in ou.children.all():
child_checkout_count += kid.checkouts.all().count()
for kid2 in kid.children.all():
child_checkout_count += kid2.checkouts.all().count()
for kid3 in kid2.children.all():
child_checkout_count += kid3.checkouts.all().count()
for kid4 in kid3.children.all():
child_checkout_count += kid4.checkouts.all().count()
for kid5 in kid4.children.all():
child_checkout_count += kid5.checkouts.all().count()
... ce qui est total de la merde. Et il faut un certain temps pour s'exécuter car il traverse à peu près une partie importante de la base de données. Aidez-moi! (Je ne peux pas sembler penser très bien aujourd'hui.)
qui fait sens. Je ne savais pas si l'ORM de Django avait ce genre de fonctionnalités intégrées. Je n'ai rien vu dans la documentation; Je voulais m'assurer que je ne manquais de rien. C'est la seule limite que j'ai rencontrée avec l'ORM de Django. J'ai trouvé cela très agréable à utiliser, et dans le contexte dans lequel je travaille, je ne suis pas concerné par les performances de pointe - cela nous convient très bien, et c'est plutôt efficace. –