[pyar] South se confunde cuando le cambio el nombre a una property?

Anthony Lenton antoniolenton en gmail.com
Jue Sep 9 11:19:44 ART 2010


2010/9/9 Federico Heinz <fheinz en vialibre.org.ar>:
> Le metí South a un proyecto que estoy haciendo, y venía bárbaro.
>
> Resulta que me encontré con que tenía que agregarle comportamiento a
> la asignación a un campo ForeignKey. "No problemo", me dije,
> ¡properties al rescate! La clase original era
>
> class Foo(models.Model):
>    bar = models.ForeignKey('Bar')
>
> lo que con la danza de las properties queda así
>
> class Foo(models.Model):
>    _bar = models.ForeignKey('Bar', db_column="bar_id")
>
>    @property
>    def bar(self):
>        return self._bar
>
>    @bar.setter
>    def bar(self, value):
>        self._bar = value
>        self.hacer_algo_mas()
>
> Todo anda perfecto... salvo por South. Pese a que los cambios sólo
> afectan el lado Python de la cosa, y la base de datos no cambió
> nada, South insiste en borrar la columna foo.bar_id de la base,
> para inmediatamente agregarla de nuevo (obviamente, perdiendo el
> contenido original en el proceso).
>
> ¿Hay forma de decirle a South "no te vuelvas loco, este cambio no
> modifica la base de datos"?

No modifica la DB, pero sí la "serialización" de tus modelos que usa
South -- ese diccionario grandote que pone al final de cada migración,
fijate que antes tenías un "bar", y después de la migración debés
tener un "_bar".

> Se me ocurre que podría decirle que genere la migración, editarla a
> mano para que no haga macanas (básicamente, cambiar el contenido de
> Migration.forwards y Migration.backwards por 'pass'), y de esa manera
> convencer a South de que hizo el trabajo, pero ¿es ese el
> procedimiento recomendado por 9 de cada 8 odontólogos que
> programan en Django?

Yo haría eso: pass en tu forwards y backwards asegura que no toca la
db, y lo mismo actualiza su visión de tus modelos.
Por otro lado, lo de usar properties para wrappear tus atributos para
que tengan otros side effects me hace un poco de ruido... no podrías
redefinir save, y meter tus efectos secundarios ahí en vez?  Eso lo he
visto más seguido, no digo que lo otro no se haga.

-- 
Anthony Lenton



More information about the pyar mailing list