Valor por defecto en migraciones 1.7 en función a otro campo

104 views
Skip to first unread message

Nekmo

unread,
Apr 2, 2015, 3:07:44 PM4/2/15
to djan...@googlegroups.com
Tras haber creado ya un campo "email" para mi modelo de usuario de
blog, he visto necesario crear después un segundo campo, "email_md5",
con el md5 checksum del mismo para tener cacheado el md5 para su uso
con Gravatar. Nada que no se pueda hacer sobrescribiendo el save:

def save(self, *args, **kwargs):
self.email_md5 = md5(self.email).hexdigest()
super(BlogUser, self).save(*args, **kwargs)

Ahora, el problema viene al crear la migración (hay que tener en
cuenta que el modelo ya existía previamente, es un campo adicionl
creado posteriormente), porque solo me permite usar datetime, y los
tipos estándar de Python. No permite hacer referencia a un campo del
modelo:

(nekmocom)[nekmo@homura ~/Workspace/nekmocom]$ ./manage.py makemigrations
You are trying to add a non-nullable field 'email_md5' to bloguser
without a default; we can't do that (the database needs something to
populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows)
2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you
can do e.g. timezone.now()
>>>

Necesitaría, poder introducir algo como lo que ya tengo en el save:

self.email_md5 = md5(self.email).hexdigest()

Me imagino que por consola así no se le podrá dar solución, pero
tampoco sé ni veo nada sobre cómo puedo modificar el archivo de
migración creado para poder establecer un valor por defecto
dinámicamente.

Un cordial saludo:
-- Nekmo.

Sitio web: http://nekmo.com
Dirección de contacto: cont...@nekmo.com
XMPP/Jabber: cont...@nekmo.com
Google+: Nekmo Com

Nekmo

unread,
Apr 2, 2015, 3:21:52 PM4/2/15
to djan...@googlegroups.com
Creo haber encontrado una solución:
https://docs.djangoproject.com/en/1.7/topics/migrations/#data-migrations

Mi caso es como el del combine_names

Un cordial saludo:
-- Nekmo.

Sitio web: http://nekmo.com
Dirección de contacto: cont...@nekmo.com
XMPP/Jabber: cont...@nekmo.com
Google+: Nekmo Com


monoBOT

unread,
Apr 2, 2015, 6:17:29 PM4/2/15
to djan...@googlegroups.com
​Yo lo haría simplemente definiendo el campo algo así (ojo al tamaño del campo)
email_md5 = models.CharField(max_length=35, default='')​

y lo guardas tal como lo haces en la sobreescritura del save.


--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
 Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
 Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
 Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a django-es+...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.



--
monoBOT
Visite mi sitio(Visit my site): monobotsoft.es/blog/

Nekmo

unread,
Apr 2, 2015, 6:43:46 PM4/2/15
to djan...@googlegroups.com
En mi caso, no quiero que dicho valor esté vacío (default=''). Porque
siempre va a tener un valor.

Lo he solucionado modificando la migración a:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from hashlib import md5

from django.db import models, migrations


def email_md5(apps, schema_editor):
BlogUser = apps.get_model("nekblog", "BlogUser")
for blog_user in BlogUser.objects.all():
blog_user.email_md5 = md5(blog_user.email).hexdigest()
blog_user.save()

class Migration(migrations.Migration):

dependencies = [
('nekblog', '0007_auto_20150301_1722'),
]

operations = [
migrations.AddField(
model_name='bloguser',
name='email_md5',
field=models.CharField(default='', max_length=32),
preserve_default=False,
),
migrations.RunPython(email_md5),
]

Un cordial saludo:
-- Nekmo.

Sitio web: http://nekmo.com
Dirección de contacto: cont...@nekmo.com
XMPP/Jabber: cont...@nekmo.com
Google+: Nekmo Com


> Para acceder a más opciones, visita https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages