es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El administrador de Django es muy lento al cargar desde el modelo de usuario OneToOne.

Creo que estoy haciendo mal el modelo de administración porque está tardando unos 30 segundos en cargar y creo que es porque mis consultas SQL son muy ineficientes y pueden estar creando más búsquedas de las necesarias. ¿Existe alguna forma en la que pueda acelerar esto?

class UserInformationAdmin(admin.ModelAdmin):
    list_display = (
        'user_username',
        'user_first_name',
        'user_last_name',
        'major'
    )

@admin.display(description='user.username')
def user_username(self, obj):
    try:
        return obj.user.username
    except Exception:
        return None

@admin.display(description='user.first_name')
def user_first_name(self, obj):
    try:
        return obj.user.first_name
    except Exception:
        return None

@admin.display(description='user.last_name')
def user_last_name(self, obj):
    return obj.user.last_name
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay varias formas de acelerar la carga del modelo de administrador. Una opción es utilizar select_related() en la queryset para obtener objetos relacionados en una sola consulta SQL en lugar de hacer múltiples consultas. Por ejemplo, se puede agregar el siguiente código a la clase UserInformationAdmin:

    class UserInformationAdmin(admin.ModelAdmin):
        ...
        def get_queryset(self, request):
            queryset = super().get_queryset(request)
            queryset = queryset.select_related('user')
            return queryset
    

    Esto obtendrá el objeto User relacionado al obtener los objetos UserInformation, reduciendo la cantidad de consultas necesarias.

    Otra opción es utilizar prefetch_related() para obtener objetos relacionados en consultas SQL separadas, pero obtenerlos todos de una vez en lugar de hacer múltiples consultas separadas. Esto puede ser útil para relaciones grandes o consultas complejas. Por ejemplo:

    class UserInformationAdmin(admin.ModelAdmin):
        ...
        def get_queryset(self, request):
            queryset = super().get_queryset(request)
            queryset = queryset.prefetch_related('some_related_objects')
            return queryset
    

    Finalmente, puede ser posible optimizar el esquema de la base de datos o utilizar índices de base de datos para mejorar el rendimiento de las consultas. Una herramienta de perfilado de base de datos o un analizador de consultas pueden ayudar a identificar cuellos de botella y sugerir mejoras.

Comments are closed.