Projet

Général

Profil

Development #42008

opengis, récupération d'une feature sur base d'un identifiant

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

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
23 avril 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

On a ?q= pour une recherche textuelle, parallèlement on pourrait avoir ?id= pour récupérer un geojson limité à la "feature" demandée.

Ça demanderait dans la configuration de préciser la propriété correspond à l'identifiant mais plutôt que ça je me demande si on ne pourrait pas juste avoir un générique ?<propriété>=<value>, qui marcherait pour n'importe quelle propriété de FeatureCache::data.


Fichiers

Révisions associées

Révision 45fe112a (diff)
Ajouté par Valentin Deniaud il y a presque 4 ans

utils: allow explicit flag on optional endpoint param (#42008)

Révision 5e0369d4 (diff)
Ajouté par Valentin Deniaud il y a presque 4 ans

opengis: filter custom query on any field (#42008)

Historique

#1

Mis à jour par Valentin Deniaud il y a environ 4 ans

Et je découvre qu'avec django-jsonfield, on ne peut pas faire de lookup sur une clé, ie features.filter(data__property=value) ne fonctionne pas. C'est bête, ce code est récent, rien n'empêchait de partir sur le JSONField dans django.contrib.postgres qui supporte très bien ce genre de chose.

Je tente d'ajouter une migration de l'un vers l'autre ? Il y a des précédents ?

#2

Mis à jour par Frédéric Péters il y a environ 4 ans

FeatureCache.objects.all().filter(data__contains={'ville': 'Bron'}) fonctionne.

Mais oui on peut imaginer la migration, j'ai l'impression qu'en terme de stockage db ça ne change rien. (il y a eu des trucs de cet ordre dans authentic, je crois).

#3

Mis à jour par Valentin Deniaud il y a environ 4 ans

  • Assigné à mis à Valentin Deniaud

Frédéric Péters a écrit :

FeatureCache.objects.all().filter(data__contains={'ville': 'Bron'}) fonctionne.

Effectivement merci, mais ça devient vite relou si on commence à imaginer {'propriétés': {'ville': 'Bron'}}, et en plus on pourrait s'éviter tout parsing du paramètre reçu. Donc je vais quand même tenter la migration.

#4

Mis à jour par Frédéric Péters il y a environ 4 ans

Tout à fait d'accord.

#5

Mis à jour par Valentin Deniaud il y a environ 4 ans

Bon j'ai vu le code dans a2, j'ai pris peur et j'ai essayé la solution simple (migration qui ajoute new_data, RunPython new_data = data, supprime data et renomme new_data -> data) et je me suis pris https://github.com/adamchainz/django-jsonfield/issues/5 en pleine tête (on ne peut pas utiliser le field de postgres tant que le projet utilise django-jsonfield, ce jusqu'à la version 1.3 et on a comme contrainte < 1.3). À part à faire sauter la contrainte de version, je vais revenir au filtrage permis par django-jsonfield...

#6

Mis à jour par Frédéric Péters il y a environ 4 ans

tant que le projet utilise django-jsonfield

Mais on peut pas juste tout virer ça ? Il me semble qu'on ne fait vraiment rien de particulier, qu'il n'y aurait même pas besoin de migration (juste traffiquer une précédente pour faire croire qu'on a depuis toujours utiliser le jsonfield de django.contrib.postgres).

#8

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

data__properties__code_insee=..., je préférerais zapper la partie data__properties, limiter la recherche au contenu de la clé properties, et dans la querystring se serait property__code_insee=... (oui, property, pas properties, parce qu'on filtre sur une seule). (j'hésite aussi à proposer property:code_insee plutôt que le double underscore).

        if s.lower() == 'true':
            return True
        if s.lower() == 'false':
            return False

Je ne ferais pas ça pour le moment, côté data.grandlyon il y a quantité de propriétés avec 'true' mis sous forme de chaine (genre "acceshandi": "true").

Dans une évolution où on aurait besoin de filtrer sur base d'un autre type, on pourrait passer par un autre paramètre, genre bool_property__whatever=true.

#9

Mis à jour par Valentin Deniaud il y a presque 4 ans

  • Statut changé de Solution proposée à En cours

Frédéric Péters a écrit :

data__properties__code_insee=..., je préférerais zapper la partie data__properties, limiter la recherche au contenu de la clé properties, et dans la querystring se serait property__code_insee=... (oui, property, pas properties, parce qu'on filtre sur une seule). (j'hésite aussi à proposer property:code_insee plutôt que le double underscore).

OK mais c'est dommage de perdre la généricité et le code trivial associé, la clé properties c'est un détail d'implem du serveur, le jour où on voudra supporter autre chose il faudra toucher le code et le complexifier.

Je ne ferais pas ça pour le moment, côté data.grandlyon il y a quantité de propriétés avec 'true' mis sous forme de chaine (genre "acceshandi": "true").

Et ça continuait à marcher, les filtres avec les conversions viennent en plus et pas à la place, mais je retire c'est pas beau de toute façon.

#10

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

la clé properties c'est un détail d'implem du serveur

Ça fait partie de la définition du format geojson.

#11

Mis à jour par Valentin Deniaud il y a presque 4 ans

Frédéric Péters a écrit :

Ça fait partie de la définition du format geojson.

Dac je savais pas, ça me va mieux.

Valentin Deniaud a écrit :

Frédéric Péters a écrit :

Je ne ferais pas ça pour le moment, côté data.grandlyon il y a quantité de propriétés avec 'true' mis sous forme de chaine (genre "acceshandi": "true").

Et ça continuait à marcher, les filtres avec les conversions viennent en plus et pas à la place, mais je retire c'est pas beau de toute façon.

Mais je garde bien la tentative de conversion des nombres ?

#12

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

Mais je garde bien la tentative de conversion des nombres ?

Je n'y avais même pas prêté attention; et je n'arrive même pas à voir dans

        kwargs.update({k: self.cast_str(v) for k, v in kwargs.items() if self.cast_str(v) is not None})

que ça vient en plus et pas à la place; en soit je veux bien, y compris le true/false, et les nombres, mais avec un commentaire là-dessus pour noter l'intention, et un test ajouté pour le filtre sur une valeur numérique/booléenne.

#13

Mis à jour par Valentin Deniaud il y a presque 4 ans

Frédéric Péters a écrit :

que ça vient en plus et pas à la place

Hum c'est parce que ça ne marchait pas du tout, on a rien vu.

Correction et ajout du bout de test qui va bien.

#14

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

  • Statut changé de Solution proposée à Solution validée
#15

Mis à jour par Valentin Deniaud il y a presque 4 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 2d59f4ef7f43767977fd7bf1efe1bb6613da770a
Author: Valentin Deniaud <vdeniaud@entrouvert.com>
Date:   Wed Apr 29 15:58:34 2020 +0200

    opengis: filter custom query on any field (#42008)

commit b76f43ca8f41a4a8856f5fbd7f48801e457e68a4
Author: Valentin Deniaud <vdeniaud@entrouvert.com>
Date:   Tue May 5 11:12:14 2020 +0200

    utils: allow explicit flag on optional endpoint param (#42008)
#16

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

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF