Je me suis retrouvé il y a quelques temps avec une problématique, remplacer une chaine par une autre dans un attribut CharField d’un model django.
La première possibilité était de faire tout simplement une belle boucle sur la totalité de mes instances de module, faire le remplacement en python et sauvegarder la nouvelle valeur.
Sauf que j’avais quasiment un million d’objet et que je n’avais pas envie que cela prenne des plombes. Et puis c’était un peu moche.
Du coup j’ai un peu fouillé et miracle, j’ai trouvé une solution que voici.
On commence par définir la fonction de remplacement, tout en django et en SQL.
from django.db.models import F, Func, Value
def replace_func(field_name, old_str, replace_str):
return Func(
F(field_name),
Value(old_str), Value(replace_str),
function='replace'
)
Ensuite, il n’y a quasiment plus rien à faire. On va simplement appeler update sur tout les objets et utiliser replace_func.
Par exemple :
MonModele.objects.filter(CONDITIONS).update(
champ_a_modifier=replace_func("champ_a_modifier",
"str_que_lon_veut_remplacer",
"nouvelle_chaine_de_caractere")
Et voila, c’est fini.
[…] Je me suis retrouvé il y a quelques temps avec une problématique, remplacer une chaine par une autre dans un attribut CharField d’un model django. La premi?… … Read More […]