Mysql
 sql >> Database >  >> RDS >> Mysql

Django self join, come convertire questa query in una query ORM

Sarà più facile farlo con un modello di dati più normalizzato. Prendi in considerazione l'utilizzo di un approccio come questo:

class NodeGroup(model.Model):
    pass

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

Quindi potresti farlo:

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'))

Sfortunatamente a quel punto, i nodi restituiti avranno dei duplicati in base se più di un nodo ha lo stesso valore per health_time . Potresti essere in grado di aggiungere un .distinct('node_group_id') questo potrebbe chiarirlo, ma non sono positivo al 100%.