Django acortar el contenido o longitud de una columna

Un problema muy común cuando haces una migración, en concreto a la hora de acortar los carácteres máximos o longitud en una columna, es no poder hacerlo porque ya existe contenido y sería un cambio destructivo. Puede ser que incluso visualices por el terminal un error como: psycopg2.errors.StringDataRightTruncation: value too long for type character varying.

¿Solución? Acortar el contenido, no hay otra. Podemos hacerlo usando el ORM de Django.

Primero entramos en la shell de Django.

python3 manage.py shell

Y ahora partimos con la siguiente premisa: el model se denomina Post, la columna content y quiero reducir a 2000 carácteres.

from app.models import Post
from django.db.models.functions import Length
posts_big = Post.objects.annotate(text_len=Length('content')).filter(text_len__gt=2000)
for post in posts_big:
    post.content=post.content[:2000]
    post.save()

Ya puedes realizar la migración. ¡Mucha suerte!

This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.

Will you buy me a coffee?

You can use the terminal.

ssh customer@andros.dev -p 5555

Written by Andros Fenollosa

February 11, 2022

1 min of reading

You may also like