Django consulta con distinto y order_by
django-models group-by (1)
Tengo dos modelos
class Employer(models.Model):
name = models.CharField(max_length=300, blank=False)
id = models.IntegerField()
status = models.IntegerField()
eminence = models.IntegerField(null=False,default=4)
class JobTitle(models.Model)
name = models.CharField(max_length=300, blank=False)
employer = models.ForeignKey(Employer,unique=False,null=True)
activatedate = models.DateTimeField(default=datetime.datetime.now)
Necesito a todos los empleadores en el orden de qué título de trabajo se activó en último lugar.
Employer.objects.filter(status=1).order_by(''eminence'',''-jobtitle__activatedate'')
Esta consulta me da lo que quiero pero devuelve empleadores repetidos si el empleador tiene más de un título de trabajo.
Yo usaría distinct()
pero en los documentos de Django encontré que
* Todos los campos utilizados en una llamada order_by () se incluyen en las columnas SQL SELECT. A veces, esto puede llevar a resultados inesperados cuando se usa junto con distinct (). Si ordena por campos de un modelo relacionado, esos campos se agregarán a las columnas seleccionadas y pueden hacer que las filas duplicadas parezcan distintas. Dado que las columnas adicionales no aparecen en los resultados devueltos (solo están allí para admitir el pedido), a veces parece que se están devolviendo resultados no distintos. *
Aunque explicaron mi problema no se especifica ninguna solución.
¿Podría darme una sugerencia? ¿Cómo puedo agrupar por mi lista de empleadores sin dañar la estabilidad de la API?
Puede colocar en la clase de Employer
su última fecha de activación de JobTitle
, y luego ordenar por este campo sin usar relaciones. [1] La compensación aquí es un poco de duplicación de datos, y la necesidad de actualizar la última fecha de activación del título del trabajo del empleador manualmente cuando se JobTitle
instancia de JobTitle
correspondiente.
También, revisa esta publicación para otra solución que use annotate()
.
Preguntas relacionadas: