Si tiene un modelo para empresas. Estas empresas tienen un atributo employment_set
, porque los trabajadores se asignan a las empresas a través de la relación laboral. ¿Cómo puedo consultar a todos los empleados de una empresa determinada? El modelo para los empleos se ve así:
class Employment(
SoftDeletableModel,
TimeStampedModel,
models.Model
):
company = models.ForeignKey(Company, on_delete=models.CASCADE)
employee = models.ForeignKey(UserWorkerProfile)
employed_by = models.ForeignKey(UserOwnerProfile)
Intenté usar company.employment_set.values("employee")
, pero esto devuelve un extraño conjunto de consultas de activador. ¿Hay alguna forma de devolver el conjunto de consultas normal? ¿O values()
ya es el método correcto?
Editar: Para eloborar un poco más: quiero terminar con un conjunto de consultas que contenga todas las instancias del modelo UserWorkerprofile.
En la documentación values()
dice:
Devuelve un QuerySet que devuelve diccionarios, en lugar de instancias de modelo, cuando se usa como iterable.
y quiero exactamente un conjunto de consultas de instancias de modelo.
Según su comentario, desea que todos UserWorkerProfile
los correos electrónicos que tengan una (puede haber cero, una o más) Employment
instancias relacionadas una Employment
instancia que tenga como Company
(todas Employment
tienen exactamente una company
), una empresa determinada.
Podemos consultar dichos correos UserWorkingProfile
electrónicos con la siguiente consulta:
UserWorkingProfile.objects.filter(employment__company=some_comany)
Por lo tanto, este conjunto de consultas devolverá todos los mensajes de correo electrónico UserWorkingProfile
para los que existe una Employment
instancia que se vincula a la empresa dada some_company
y eso UserWorkingProfile
.
En Django uno usa dos guiones bajos consecutivos para mirar "a través" de una relación (esto se puede usar de forma bidireccional , tenga en cuenta que dos guiones bajos consecutivos se usan para otras cosas además de mirar a través de relaciones).
Por lo tanto, escribimos una consulta que se parece más o menos a:
SELECT `userworkingprofile`.*
FROM `userworkingprofile`
JOIN `employment` ON `employment`.`employee_id` = `userworkingprofile`.`id`
WHERE `employment`.`company_id` = 123
Con 123
en realidad el pk
de some_company
.
Tenga en cuenta que es posible que ocurra lo mismo varias veces en este conjunto de consultas, si el empleado ha trabajado varias veces para .UserWorkingProfile
some_company
Si desea que todos UserWorkingProfile
ocurran como máximo una vez , debe agregar .distinct()
:
UserWorkingProfile.objects.filter(employment__company=some_comany).distinct()
Aunque Django de hecho define un administrador de objetos nombrado employment_set
en una Company
instancia, hasta donde yo sé, no se pueden "combinar" dos administradores de este tipo (por
lo que no funcionará).some_company.employment_set.employee
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras