{"id":3156,"date":"2025-01-05T00:55:21","date_gmt":"2025-01-04T23:55:21","guid":{"rendered":"https:\/\/j-mad.com\/blog\/?p=3156"},"modified":"2025-01-05T00:55:23","modified_gmt":"2025-01-04T23:55:23","slug":"comment-remplacer-une-chaine-par-une-autre-dans-le-champ-dun-model-django","status":"publish","type":"post","link":"https:\/\/j-mad.com\/blog\/2025\/01\/05\/comment-remplacer-une-chaine-par-une-autre-dans-le-champ-dun-model-django\/","title":{"rendered":"Comment remplacer une chaine par une autre dans le champ d\u2019un Model Django"},"content":{"rendered":"\n<p>Je me suis retrouv\u00e9 il y a quelques temps avec une probl\u00e9matique, remplacer une chaine par une autre dans un attribut CharField d\u2019un model django.<\/p>\n\n\n\n<p>La premi\u00e8re possibilit\u00e9 \u00e9tait de faire tout simplement une belle boucle sur la totalit\u00e9 de mes instances de module, faire le remplacement en python et sauvegarder la nouvelle valeur.<\/p>\n\n\n\n<p><br>Sauf que j\u2019avais quasiment un million d\u2019objet et que je n\u2019avais pas envie que cela prenne des plombes. Et puis c\u2019\u00e9tait un peu moche.<\/p>\n\n\n\n<p>Du coup j\u2019ai un peu fouill\u00e9 et miracle, j\u2019ai trouv\u00e9 une solution que voici.<\/p>\n\n\n\n<p>On commence par d\u00e9finir la fonction de remplacement, tout en django et en SQL.<\/p>\n\n\n\n<pre class=\"wp-block-code\">\n\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><div class=\"text codecolorer\">from django.db.models import F, Func, Value<br \/>\ndef replace_func(field_name, old_str, replace_str):<br \/>\n&nbsp; &nbsp; return Func(<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; F(field_name),<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Value(old_str), Value(replace_str),<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; function='replace'<br \/>\n&nbsp; &nbsp; )<\/div><\/div>\n\n<\/pre>\n\n\n\n<p>Ensuite, il n\u2019y a quasiment plus rien \u00e0 faire. On va simplement appeler update sur tout les objets et utiliser replace_func.<\/p>\n\n\n\n<p>Par exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\">\n\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><div class=\"text codecolorer\">MonModele.objects.filter(CONDITIONS).update(<br \/>\n&nbsp; &nbsp; champ_a_modifier=replace_func(&quot;champ_a_modifier&quot;,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;str_que_lon_veut_remplacer&quot;,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;nouvelle_chaine_de_caractere&quot;)<\/div><\/div>\n\n<\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>Et voila, c\u2019est fini.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Je me suis retrouv\u00e9 il y a quelques temps avec une probl\u00e9matique, remplacer une chaine par une autre dans un attribut CharField d\u2019un model django. La premi\u00e8re possibilit\u00e9 \u00e9tait de faire tout simplement une belle boucle sur la totalit\u00e9 de mes instances de module, faire le remplacement en python et sauvegarder la nouvelle valeur. Sauf &hellip; <a href=\"https:\/\/j-mad.com\/blog\/2025\/01\/05\/comment-remplacer-une-chaine-par-une-autre-dans-le-champ-dun-model-django\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Comment remplacer une chaine par une autre dans le champ d\u2019un Model Django<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[6],"tags":[],"class_list":["post-3156","post","type-post","status-publish","format-standard","hentry","category-django"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p12cdp-OU","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/3156","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/comments?post=3156"}],"version-history":[{"count":7,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/3156\/revisions"}],"predecessor-version":[{"id":3163,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/3156\/revisions\/3163"}],"wp:attachment":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/media?parent=3156"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/categories?post=3156"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/tags?post=3156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}