sql >> Base de Datos >  >> RDS >> Mysql

Django self join, Cómo convertir esta consulta a una consulta ORM

Le resultará más fácil hacer esto con un modelo de datos más normalizado. Considere usar un enfoque como este:

class NodeGroup(model.Model):
    pass

class NodeHealth(model.Model):
    node_group = models.ForeignKey(NodeGroup, related_name='nodes')
    health_time = models.IntegerField()
    status = models.IntegerField()

Entonces podrías hacer esto:

from django.db.models import Max, F

nodes = NodeHealth.objects.all().annotate(
    max_health_time=Max('node_group__nodes__health_time')
).filter(health_time=F('max_health_time'))

Desafortunadamente, en ese momento, los nodos devueltos tendrán duplicados si más de un nodo tiene el mismo valor para health_time . Es posible que pueda agregar un .distinct('node_group_id') eso podría aclarar eso, pero no estoy 100% seguro.