- Moté,
Bonjour,
Mon application Django repose sur une fonction de recherche. J’ai prévu pour celle-là (la recherche) d’utiliser des paramètres URL sur une méthode get. Seulement, je voulais isoler la fonction de recherche pour la rendre déjà testable, et réutilisable (notamment en API).
J’ai donc défini une fonction avec deux paramètres obligatoires, le point de recherche de base et la distance de recherche, et un dictionnaire de filtres supplémentaires optionnels. Voilà ce que cela donne :
def ecoliste_research(search_location: Point, distance: int, filters: dict = None) -> list[Address]:
addresses = Address.objects.filter(
geolocation__distance_lte=(search_location, D(km=distance))
)
if filters:
if "materials" in filters.keys():
addresses = addresses.filter(
enterprise__products__type_id__in=filters["materials"]
)
# D’autres sur le même motif, que j’enlève pour raccourcir
return addresses
Et voilà le test sur lequel je suis, qui actuellement fonctionne :
def test_search_materialtype(self) -> None:
filters = {"materials": [1,]}
addresses = ecoliste_research(self.search_location, 1000, filters=filters)
self.assertIn(self.enterprise1_address, addresses)
self.assertNotIn(self.enterprise_multi_address1, addresses)
Seulement, Django ne retourne pas un dictionnaire, mais un QueryDict
. Et comme on le voit sur la doc, les QueryDict
ne retourne pas une liste de valeurs lorsque appelé sur une clef, mais uniquement la dernière. Il y a bien une fonction qui permet de retourner une liste, QueryDict.getlist(key, default=None)
. Par contre, le cast en dict
utilise le même système de ne rendre que la dernière valeur.
J’ai donc deux solutions :
- Modifier ma fonction pour qu’elle prenne un
QueryDict
en paramètre. Ce QueryDict comprendrait également les deux paramètres de base pour la recherche, le point et la distance de recherche. J’ai l’impression que je perds en souplesse sur ma fonction avec ça ? - Transformer le
QueryDict
endict
, mais Django n’a pas implémenté ça, et j’ai l’impression que ce serait un peu sale à faire, non ?
Merci