¿Cómo mono parche Django?

Me encontré con este post en Django parcheando monos:

from django.contrib.auth.models import User User.add_to_class('openid', models.CharField(max_length=250,blank=True)) def get_user_name(self): if self.first_name or self.last_name: return self.first_name + " " + self.last_name return self.username User.add_to_class("get_user_name",get_user_name) 

Entiendo que esto no es ideal y es mejor agregar campos y funciones al User través de un Profile separado.

Dicho esto, solo quiero entender cómo funcionaría esto:

  1. ¿Dónde pondría el código de parche del mono?

  2. ¿Cuándo se ejecuta el código – solo una vez? ¿Una vez por cada intérprete de Python? una vez por solicitud?

  3. Supongo que todavía tendría que cambiar el esquema de base de datos. Entonces, si dejo caer la tabla User y ejecuté ./manage.py syncdb , ¿ syncdb “sabría” que se ha agregado un nuevo campo al User ? Si no, ¿cómo cambio el esquema?

Podría ponerlo en cualquier lugar, pero es común ver este tipo de cosas vinculadas en el archivo de configuración (o incluso en la urlconf). En cualquier lugar donde pueda poner una señal también podría ser apropiado. Este código debería ser un poco más inteligente: a menudo los archivos se importan más de una vez y no hay mucho que puedas hacer al respecto, por lo que puedes tener problemas si intentas ejecutar un código como este varias veces.

El código debe ejecutarse al menos una vez para cada proceso de python.

Sí, necesitarías cambiar el DB a mano. Syncdb probablemente no detectaría el cambio (no he mirado detenidamente el código), pero podría haber algunos lugares donde podría colocar el código que funcionaría.

Parece que ya sabes que esto es algo terrible, horrible y nunca se debe hacer con código real, por lo que no voy a tratar ese punto. Hacer este tipo de cosas es una manera fantástica de generar errores realmente difíciles de encontrar en su código, además del código que puede no funcionar en futuras versiones de Django.

Además, no funcionará bien con South, que deberías usar.

ponga el archivo monkey_patching.py en cualquiera de sus apps e impórtelo en el archivo __init__.py la aplicación. es decir:

app / monkey_patching.py

 #app/monkey_patching.py from django.contrib.auth.models import User User.add_to_class('openid', models.CharField(max_length=250,blank=True)) def get_user_name(self): if self.first_name or self.last_name: return self.first_name + " " + self.last_name return self.username User.add_to_class("get_user_name",get_user_name) 

app / __ init__.py

 #app/__init__.py import monkey_patching