Bug #33262
queryset, ne pas mettre en cache sur un __getitem__ non numérique
Début:
20 mai 2019
Echéance:
% réalisé:
0%
Temps estimé:
Patch proposed:
Oui
Planning:
Non
Description
Django quand il voit form.objects.current_user il passe par là :
for bit in self.lookups: try: # dictionary lookup current = current[bit] # ValueError/IndexError are for numpy.array lookup on # numpy < 1.9 and 1.9+ respectively except (TypeError, AttributeError, KeyError, ValueError, IndexError): try: # attribute lookup
Ça fait donc d'abord un ['current_user'], avant de faire un .current_user; c'est-à-dire un appel à __getitem__
. Mais cet appel, il va mettre en cache le résultat.
Fichiers
Révisions associées
Historique
Mis à jour par Frédéric Péters il y a presque 5 ans
- Fichier 0001-lazy-only-create-resultset-on-numeric-access-to-__ge.patch 0001-lazy-only-create-resultset-on-numeric-access-to-__ge.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Mis à jour par Thomas Noël il y a presque 5 ans
- Statut changé de Solution proposée à Solution validée
Dans l'idée peut-être improbable d'avoir un getitem(None) je proposerai bien un except (TypeError, ValueError)
à la place du simple ValueError
(Mais c'est sans doute improbable, dunno, donc je acke quand même)
Mis à jour par Frédéric Péters il y a presque 5 ans
- Statut changé de Solution validée à Résolu (à déployer)
L'exception serait attrapée dessous, dans le _resolve_lookup de django. (ce patch aurait pu simplement poser int(key) sans parler d'exceptions mais j'ai trouvé ça plus clair et une opportunité pour poser le commentaire d'explication).
commit 2eb1614dbb2addc265f943b84eadbdfc5e91233f Author: Frédéric Péters <fpeters@entrouvert.com> Date: Mon May 20 13:26:38 2019 +0200 lazy: only create resultset on numeric access to __getitem__ (#33262)
Mis à jour par Frédéric Péters il y a presque 5 ans
- Statut changé de Résolu (à déployer) à Solution déployée
lazy: only create resultset on numeric access to getitem (#33262)