2012-07-15 13 views
5

En Django, en una configuración recomendada, una instancia de UserProfile está vinculada por OneToOneField con su instancia de usuario.La manera más eficiente de recuperar usuarios con el perfil de usuario en Django

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    data = ... 

¿Cuál es la forma más eficiente dentro de una vista para recuperar tanto el usuario como el perfil? ¿Puedo hacer una consulta de combinación interna select_related() para obtener ambos objetos con un hit de base de datos? ¿O siempre se reduce a dos llamadas por separado? Posiblemente, el middleware de autenticación de Django recupera la instancia del usuario incluso antes de que se llame a la vista ... ¿Alguien sabe?

+1

para proporcionar más detalles: El perfil puede ser recuperada a través de request.user.userprofile o request.user.get_profile(). Sin embargo, ambos resultan en dos aciertos de base de datos. Mi pregunta es: ¿podemos reducir esto a una sola consulta de unión interna utilizando select_related ... y si es así: ¿es esto más eficiente que la forma "habitual"? –

Respuesta

1

El perfil de usuario se puede recuperar usando get_profile().

Ver documentación: https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

+0

Django menciona en alguna parte que get_profile almacena en caché su resultado, pero eso es cierto para todas las solicitudes. Así que realmente no veo la ventaja en comparación con "user.userprofile". Pero lo que realmente me desconcierta es que al usar ambos, user.get_profile y user.userprofile, en la misma plantilla, la base de datos recibe dos golpes. Hasta ahora, me apego sistemáticamente a user.userprofile. De todos modos, ambos métodos de recuperación del perfil dan como resultado 2 visitas a la base de datos: 1x usuario + 1x perfil. Una llamada select_related hace eso en UNA unión interna. ¿Es eso posible y ventajoso? –

Cuestiones relacionadas