Projet

Général

Profil

Bug #33262

queryset, ne pas mettre en cache sur un __getitem__ non numérique

Ajouté par Frédéric Péters il y a presque 5 ans. Mis à jour il y a presque 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
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

Révision 2eb1614d (diff)
Ajouté par Frédéric Péters il y a presque 5 ans

lazy: only create resultset on numeric access to getitem (#33262)

Historique

#1

Mis à jour par Frédéric Péters il y a presque 5 ans

#3

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)

#4

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)
#5

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

Formats disponibles : Atom PDF