Как оптимизировать цикл "For" в Django

Я хочу оптимизировать эти функции, потому что они занимают слишком много времени, каждая из них приносит определенные атрибуты, если вы можете мне помочь. Я думаю, может есть способ вызывать атрибуты в функции. Функции сделаны с помощью python и Django.

Вот что я сделал на данный момент.

Определение функций.

cand_seleccionados = ListaFinal.objects.filter(interesado__id_oferta=efectiva.oferta.id)

seleccionados_ids = cand_seleccionados.values_list("interesado_id", flat=True)

cand_postulados = Postulados.objects.filter(
    interesado__id_oferta=efectiva.oferta.id
).exclude(interesado_id__in=seleccionados_ids)

postulados_ids = cand_postulados.values_list("interesado_id", flat=True)

cand_entrevistados = Entrevistados.objects.filter(
    interesado__id_oferta=efectiva.oferta.id
).exclude(interesado_id__in=postulados_ids)

Это цикл для cand_Postulados, остальные такие же, поэтому я подумал, что нет необходимости размещать больше

for p in cand_postulados:

    postulado = dict()

    telefono = Perfil.objects.values_list("telefono", flat=True).get(
        user_id=p.interesado.candidato.id
    )

    postulado["id"] = p.interesado.candidato.id
    postulado["nombre"] = p.interesado.candidato.first_name
    postulado["email"] = p.interesado.candidato.email
    postulado["teléfono"] = telefono

    if p.interesado.id_oferta.pais is None:
        postulado["pais"] = "Sin pais registrado"
    else:
        postulado["pais"] = p.interesado.id_oferta.pais.nombre

    postulado["nombre_reclutador"] = p.interesado.id_reclutador.first_name
    postulado["id_reclutador"] = p.interesado.id_reclutador.id

    postulados.append(postulado)

Если я правильно понял ваш цикл, это должно делать все в одном запросе. (Вам может понадобиться скорректировать некоторые из __ охватывающих поисков , если я читаю что-то неправильно. В частности, я не обязательно знаю обратное имя вашего отношения Perfil к user.)

cand_postulados = (
    Postulados.objects
    .filter(interesado__id_oferta=efectiva.oferta.id)
    .exclude(interesado_id__in=seleccionados_ids)
)
postulados = list(cand_postulados.values(
    teléfono="interesado__candidato__telefono",
    nombre="interesado__candidato__first_name",
    email="interesado__candidato__email",
    pais="interesado__id_oferta__pais__nombre",
    nombre_reclutador="interesado__id_reclutador__first_name",
    id_reclutador="interesado__id_reclutador__id",
))
for datum in postulados:
    if not datum.get("pais"):
        datum["pais"] = "Sin pais registrado"
Вернуться на верх