Look it up


Je travaille sur un projet magique. Chaque jour est une nouvelle découverte, une aventure !

Par exemple, c’est un projet utilisant l’excellent Django Rest Framework, une app Django très puissante qui permet de créer des API succulentes.

DRF est très flexible, et permet de régler tout un tas de paramètres à l’aide de classes de configuration. Par exemple, il extrait automatiquement tout champ lookup_field sur ses classes Serializer afin de choisir sur quel champ filtrer les données.

L’auteur du code que j’ai sous les yeux, je crois, a voulu être vraiment, mais alors vraiment sûr d’avoir un look up:

class FooViewSet(ModelViewSet):
 
    class Meta:
        model = Foo
        lookup_field = 'pk'
        lookup_fields = ('pk', 'data_id')
        extra_lookup_fields = None

En soi, c’est très drôle.

Et je pourrais arrêter l’article ici.

Mais non.

En effet, y a pas un truc qui vous choque ?

Je veux dire, autre que la sainte trinité des lookup fields…

Allez, relisez l’article depuis le début, je vous laisse une chance.


J’ai dit que DRF extrayait un champ lookup_field sur les classes Serializer, et comme vous pouvez le constater, l’auteur ici hérite joyeusement de ModelViewSet, mais pas du tout de Serializer.

Oui, parce qu’on est en pleine exploration de Fistland (Au fond du fun !™), ces 3 champs ne sont en aucun cas exploités automatiquement par DRF… car sur les Viewset, lookup_field est utilisé pour générer des URLs, et mes prédécesseurs ont créé un router custo qui override ceci. Mais si on retire les champs, ça pète tout car il y a des bouts de leur code qui supposent l’existence de ce champ.

Néanmoins, ne soyons pas complètement négatif, certaines classes héritent bien de Serialiser, et définissent aussi lookup_field. D’ailleurs une part de mon job est de migrer tout ça. Car la petite touche humoristique finale, c’est que lookup_field est deprecated depuis 3 releases dans DRF \o/ Mais deprecated sur les Serializer uniquement hein, pas les Viewset. Enfin je dis ça…

7 thoughts on “Look it up

  • furankun

    Courage et abnégation sont les branches du IF du codeur python.

  • bob

    «mes prédécesseurs ont créé un router custo qui extrait ce champ pour générer des URLs à la volée.»

    Les mecs se sont chiés dans la tête là c’est pas possible !

    (typo sur «vraiment sûr» et lien vers DRF invalide)

  • Sam Post author

    En fait, c’est une feature de DRF à la base qu’ils ont overridé pour le faire à leur sauce. J’édite pour rendre ça plus claire.

  • bob

    Ouf j’avais compris qu’il avait réécrit ce que fait DRF de base.

    Bon courage pour ce nettoyage.

    (typo : extraiyais / extrayait)

  • Marc

    Ah ah, on a plus ou moins le même symptôme chez nous, à la différence qu’on essaye de blinder les comportements de tests unitaires et toujours suivre l’évolution des produits, surtout DRF et sa politique de dépréciation agressive. :D

    DRF est un produit magnifique, mais la tentation de la pierre brute que l’on veut tailler à la perfection est trop forte et on finit par violer le produit d’origine. ^^

  • Dudule

    “En soit, c’est très drôle.” => “En soi, c’est très drôle.” :3

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.