Deshágase de get_profile () en una migración a Django 1.6

Con Django 1.5 y la introducción de modelos de usuario personalizados, AUTH_PROFILE_MODULE quedó en desuso. En mi aplicación Django existente, uso el modelo de User y también tengo un modelo de Profile con una clave externa para el User y almaceno otras cosas sobre el usuario en el perfil. Actualmente AUTH_PROFILE_MODULE y esto se establece en ‘app.profile’.
Así que, obviamente, mi código tiende a hacer un montón de user.get_profile() y esto ahora debe desaparecer.

Ahora, podría crear un nuevo modelo de usuario personalizado (con solo tener mi modelo de perfil extendido User ) pero luego en todos los otros lugares donde actualmente tengo una clave externa para un usuario, también tendré que cambiarlo … así que esto sería un Gran migración en mi servicio en vivo.

¿Hay alguna forma, y ​​sin migración del modelo, y solo creando / anulando la función get_profile() con algo como my_user.userprofile_set.all()[0] ) en alguna parte?

¿Alguien que ha ido por este camino y puede compartir ideas o experiencias?

Si volviera a hacer este servicio ahora, obviamente no iría de esta manera, pero con un sistema de producción en vivo semi-grande estoy abierto para atajos 🙂

El uso de un modelo de perfil con una relación con el User incorporado sigue siendo una construcción totalmente legítima para almacenar información adicional del usuario (y se recomienda en muchos casos). Las AUTH_PROFILE_MODULE y get_profile() que ahora están en desuso simplemente terminaron siendo innecesarias, dado que la syntax Django 1-a-1 incorporada funciona limpia y elegantemente aquí.

La transición del uso anterior es realmente fácil si ya está utilizando OneToOneField para User en su modelo de perfil , que es la forma en que se recomendó configurar el módulo de perfil antes de que se desaprobara get_profile .

 class UserProfile(models.Model): user = OneToOneField(User, related_name="profile") # add profile fields here, eg, nickname = CharField(...) # usage: no get_profile() needed. Just standard 1-to-1 reverse syntax! nickname = request.user.profile.nickname 

Vea aquí si no está familiarizado con la magia sintáctica para OneToOneField que lo hace posible. Termina siendo una simple búsqueda y reemplazo de get_profile() para el profile o cualquiera que sea su nombre relacionado (el nombre relacionado automáticamente en el caso anterior sería user_profile ). La syntax inversa estándar de django 1-1 es realmente mejor que get_profile() !

Cambiar una ForeignKey a un OneToOneField

Sin embargo, me doy cuenta de que esto no responde a su pregunta por completo. OneToOne que utilizaste una ForeignKey para el User en tu módulo de perfil en lugar de OneToOne , lo cual está bien, pero la syntax no es tan simple si la dejas como ForeignKey , como lo anotarás en tu comentario de seguimiento.
Suponiendo que estaba usando su ForeignKey en la práctica como una clave externa única (esencialmente una 1 a 1), dado que en el DB OneToOneField es solo un campo ForeignKey con una unique=True restricción , debería poder cambiar la ForeignKey campo a un OneToOneField en su código sin tener que realizar una migración de base de datos significativa o incurrir en la pérdida de datos.

Tratar con la migración del sur

Si está utilizando South para migraciones, el cambio de código de la sección anterior puede confundir a South con la eliminación del campo anterior y la creación de uno nuevo si realiza una schemamigration --auto , por lo que es posible que deba editar manualmente la migración para hacer cosas. Correcto. Un enfoque sería crear la migración de esquema y luego borrar los métodos de avance y retroceso para que realmente no intente hacer nada, pero aún así, el modelo se congela correctamente como un OneToOneField en el futuro. Luego, si desea hacer las cosas a la perfección, también debe agregar la restricción única a la columna de clave externa de la base de datos correspondiente. Puede hacerlo manualmente con SQL o vía South (editando los métodos de migración manualmente, o configurando unique=True en ForeignKey y creando una primera migración South antes de cambiarlo a OneToOneField y hacer una segunda migración y OneToOneField blanco hacia fuera los métodos hacia adelante / hacia atrás).