Método select_related en Django

Salman Mehmood 20 junio 2023
Método select_related en Django

El artículo aborda los conjuntos de consultas, cómo trabajar estas consultas y cómo usar el método select_related() en Django. Mientras usamos el marco Django, usamos principalmente el conjunto de consultas.

Supongamos que tenemos una base de datos y vamos a realizar una consulta. Supongamos que tenemos un modelo llamado “proveedor”, y a través de este “proveedor”, tomaremos todos los proveedores, por lo que vamos a tener una lista de proveedores, y esa lista se llamará “conjunto de consulta”. .

Veremos el archivo views.py, donde escribiremos la lógica y crearemos dos modelos. Comenzaremos a escribir código explicando el caso de uso del método select_related().

Primero, buscamos empleados usando objects.all(). Necesitamos recorrer la lista de ese empleado e imprimir los nombres de los empleados usando emplyee.name.

Código:

from company.models import Department, Employee


def home(request):
    employees = Employee.objects.all()
    for emplyee in employees:
        print(emplyee.name)

Producción :

Jane Doe
John Doe
Simpson
John Simpson

Si usamos la herramienta de depuración y vamos a nuestro navegador, veremos que obtiene todos los empleados y los departamentos correspondientes y sus detalles. Dado que objects.all() selecciona a todos los empleados y obtiene todos los detalles.

El problema comienza cuando accedemos al modelo relacionado. Por ejemplo, buscamos en nuestro archivo models.py, y el modelo empleado que es un modelo relacionado es el propio departamento.

Imprimiremos el nombre del empleado más el nombre de su departamento usando el siguiente código.

Código:

from company.models import Department, Employee


def home(request):
    employees = Employee.objects.all()
    for emplyee in employees:
        print(emplyee.name, emplyee.department.name)

Usamos el empleado.departamento en el código anterior, y el departamento es una clave externa. Nos dará ese objeto departamento donde están los nombres de nuestros departamentos.

Producción :

Jane Doe HR
John Doe Accounts
Simpson Purchase
John Simpson Purchase

Podemos ver múltiples consultas si ingresamos al navegador mientras ejecutamos nuestra aplicación Django con la ayuda de la herramienta de depuración de Django. Podemos ver en la primera consulta que selecciona a todos los empleados, y la segunda selecciona el departamento, el cual tiene un id de 1.

Si tenemos la misma identificación del empleado aunque sea el mismo subyacente, el ORM irá dos veces a esa tabla y buscará los duplicados. Supongamos que tenemos cien empleados en nuestra empresa, entonces ejecutará consultas 101, es decir, 100 consultas del departamento y una consulta del empleado.

Esto también se conoce como un problema clásico interminable en ORM. Obtendrá esos empleados y sus departamentos correspondientes usando el método select_related(), y necesitamos pasar el campo de nuestro modelo en el método.

Entonces el campo tiene sentido estar relacionado, y en nuestro caso, usamos el campo como un departamento.

Código:

from company.models import Department, Employee


def home(request):
    employees = Employee.objects.all().select_related("department")
    for emplyee in employees:
        print(emplyee.name, emplyee.department.name)
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn